29

Tôi muốn có ứng dụng Java trên máy tính để bàn của mình để có một dấu hiệu đơn lẻ liên quan đến người dùng Active Directory . Trong hai bước, tôi muốn:Cách sử dụng đăng nhập Windows cho đăng nhập một lần và cho các mục nhập Active Directory cho ứng dụng Desktop Java?

  1. Đảm bảo rằng người dùng cụ thể đã đăng nhập vào Windows bằng một số mục nhập của người dùng.
  2. Kiểm tra một số thông tin cài đặt cho người dùng đó từ Active Directory

Với Java: Programatic Way to Determine Current Windows User Tôi có thể lấy tên của người dùng Windows hiện tại nhưng tôi có thể dựa vào đó? Tôi nghĩ rằng

System.getProperty("user.name") 

sẽ không đủ an toàn? ("user.name" dường như có được từ các biến môi trường, vì vậy tôi không thể dựa vào đó, tôi nghĩ?)

Câu hỏi Authenticating against Active Directory with Java on Linux cung cấp cho tôi xác thực cho tên + pass nhưng tôi muốn xác thực dựa trên đăng nhập Windows?

Để truy cập Thư mục hoạt động, LDAP có thể sẽ là sự chọn lựa?

Tôi không hoàn toàn chắc chắn nếu tôi đặt câu hỏi đúng nhưng hy vọng ai đó có một số ý tưởng để chuyển tiếp tôi.

Trả lời

13

Nó không được hỗ trợ. Java 6 có những cải tiến, nhưng chưa đủ.

Java có ngăn xếp GSS riêng. Vấn đề là cho đăng nhập một lần, bạn cần lấy vé Kerberos từ hệ điều hành (không phải là ngăn xếp Java). Nếu không, người dùng phải xác thực lần thứ hai (đánh bại mục đích đăng nhập một lần).

Nhìn vào http://java.sun.com/developer/technicalArticles/J2SE/security/. Tìm hiểu về "Access Native GSS-API" và nó nói về một thuộc tính hệ thống mới sun.security.jgss.native mà khi được đặt thành true sẽ làm cho Java sử dụng triển khai GSS OS bên dưới, cho phép truy cập vào xác thực mức hệ điều hành. Hoàn hảo! .... ngoại trừ nó chỉ được hỗ trợ cho Solaris và Linux, không phải Microsoft Windows.

Tuy nhiên, Java 6 dường như có đủ hỗ trợ để hoạt động với tư cách máy chủ nhận yêu cầu xác thực SPNEGO từ IE và sau đó xác thực người dùng đó đối với Active Directory. Chỉ hỗ trợ máy khách của máy tính để bàn vẫn chưa hoàn chỉnh.

+0

Có bất kỳ JVM nào khác cung cấp quyền truy cập vào vé Kerberos như được mô tả không? –

+1

Dường như Java 8 có hỗ trợ đó. https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/jgss-features.html – Ramiro

0

Kiểm tra JCIFS tại http://jcifs.samba.org/

Khác hơn thế, gắn bó với LDAP (trên thực tế, nó phải là lần thử đầu tiên của tôi, nhưng ...)

0

Bạn đã xem là sử dụng api JNA (cho phép bạn làm các cuộc gọi bản địa đến hệ điều hành dễ dàng)?

Bạn có thể gọi win32 metod GetCurrentUser tài liệu MSDN tại http://msdn.microsoft.com/en-us/library/ms724432(VS.85).aspx. Nó nằm bên trong Advapi32.dll.

Nó cũng có phiên bản unicode, GetCurrentUserW nếu cần.

Và bạn đã đúng. Dường như biến môi trường có thể được thay đổi, để có thể gây hiểu nhầm khi sử dụng.

Tôi không chắc về ý nghĩa nền tảng chéo trên các cửa sổ 32/64bit. Nếu bạn cần giải pháp trong mã, tôi chắc chắn rằng tôi có thể viết một cái gì đó cho nó.

Nhưng yea, chỉ cần một ý tưởng :)

5

Sử dụng JAAS với một LDAP LoginModule. Điều này sẽ cho phép bạn cắm vào cơ sở hạ tầng bảo mật Java cơ bản.

Khi bạn cần ứng dụng ngoại tuyến hoặc "gỡ lỗi" ứng dụng, bạn có thể dễ dàng hoán đổi mô-đun LDAP cho mô-đun giả. Điều này cho phép bạn tiếp tục thử nghiệm "bảo mật" của bạn, mà không phụ thuộc vào Active Directory. Có thể kiểm tra cao, tách riêng và bạn có thể xác thực lược đồ sau đó với hầu như không có đau buồn.

+0

Cảm ơn, Điều đó có hỗ trợ xác thực bằng đăng nhập Windows không? (Vì vậy, khi người dùng đăng nhập vào Windows, anh/cô ấy không phải nhập tên người dùng và mật khẩu cho ứng dụng java một cách riêng biệt) Lúc đầu tôi không tìm thấy điều đó, phải tiếp tục tìm kiếm. – Touko

+0

Hmmm. Các mô-đun duy nhất tôi đã thấy rằng làm điều đó là một phần của một khung công tác lớn hơn như WebLogic ... hoặc là thiết kế cho máy khách Java để chuyển các thông tin đăng nhập tới một Máy chủ Web. Bạn có thể phải viết một Nhà cung cấp JAAS nhỏ bằng cách sử dụng các cuộc gọi bản địa để thực hiện điều này một cách đáng tin cậy. –

+2

Thay vì sử dụng LDAP LoginModule, Krb5LoginModule dường như có thể sử dụng bộ nhớ cache của hệ điều hành (thông tin đăng nhập có trên Windows logon) khi được sử dụng với tham số useTicketCache. Dường như vẫn còn một số vấn đề, nhưng hiện tại nó vẫn hoạt động .. – Touko

0

Bạn có thể sẽ linh hoạt nhất bằng cách sử dụng Spring Security. Bạn có thể sử dụng nó với cả xác thực JAAS và LDAP.

2

Chỉ vì lợi ích của người khác đọc chủ đề này, http://www.javaactivedirectory.com/?page_id=196 có một ví dụ về cách làm dấu hiệu duy nhất trên với Windows/Active Directory

+0

Ý tưởng tương tự như James Schek nhưng có hướng dẫn rõ ràng, cảm ơn! Một trong những nhược điểm chính vẫn còn, một trong những rắc rối với Windows registry (allowtgtsessionkey Registry Key) mà không phải là possibile trong mọi trường hợp (rắc rối với thiết lập + tất cả mọi người không thích đăng ký đang được thay đổi) – Touko

+3

liên kết đáng buồn là bị hỏng và không dễ dàng determinable :-((-1) –

4

Dự án Waffle có cả client và server-side code để làm SSO trên Windows. Nó dựa trên JNA, không cần thư viện gốc.

+0

Chỉ hoạt động với máy chủ và máy khách windows –

Các vấn đề liên quan