Có 3 giao thức xác thực có thể được sử dụng để thực hiện xác thực giữa Java và Active Directory trên Linux hoặc bất kỳ nền tảng khác (và đây không phải là chỉ cụ thể với các dịch vụ HTTP):
Kerberos - Kerberos cung cấp đăng nhập một lần (SSO) và ủy quyền nhưng máy chủ web cũng cần hỗ trợ SPNEGO để chấp nhận SSO thông qua IE.
NTLM - NTLM hỗ trợ SSO qua IE (và các trình duyệt khác nếu chúng được định cấu hình đúng).
LDAP - Một liên kết LDAP có thể được sử dụng để chỉ xác thực tên tài khoản và mật khẩu.
Còn có tên gọi là "ADFS"
Mỗi giao thức có lợi thế của nó nhưng theo quy tắc chung, để có khả năng tương thích tối đa, bạn thường nên cố gắng "làm như Windows". Vậy Windows làm gì? Trước tiên, xác thực giữa hai máy Windows ưa chuộng Kerberos vì máy chủ không cần giao tiếp với DC và khách hàng có thể lưu trữ vé Kerberos để giảm tải trên DC (và vì Kerberos hỗ trợ ủy quyền).
Nhưng nếu các bên xác thực không có cả hai tài khoản miền hoặc nếu khách hàng không thể liên lạc với DC, thì NTLM là bắt buộc. Vì vậy, Kerberos và NTLM không loại trừ lẫn nhau và NTLM không bị lỗi thời bởi Kerberos. Trong thực tế trong một số cách NTLM là tốt hơn so với Kerberos. Lưu ý rằng khi đề cập đến Kerberos và NTLM trong cùng một hơi thở, tôi cũng phải đề cập đến SPENGO và Xác thực Windows Tích hợp (IWA). IWA là một thuật ngữ đơn giản về cơ bản có nghĩa là Kerberos hoặc NTLM hoặc SPNEGO để thương lượng Kerberos hoặc NTLM.
Sử dụng liên kết LDAP như một cách để xác thực bằng chứng xác thực không hiệu quả và yêu cầu SSL. Nhưng cho đến khi triển khai gần đây Kerberos và NTLM đã gặp nhiều khó khăn, do đó việc sử dụng LDAP như một dịch vụ xác thực dịch chuyển đã tồn tại. Nhưng vào thời điểm này, nó thường nên tránh. LDAP là một thư mục thông tin chứ không phải là dịch vụ xác thực. Sử dụng nó cho mục đích của nó.
Vậy làm cách nào để bạn triển khai Kerberos hoặc NTLM trong Java và trong ngữ cảnh của các ứng dụng web nói riêng?
Có một số công ty lớn như Quest Software và Centrify có các giải pháp đề cập cụ thể đến Java. Tôi thực sự không thể bình luận về chúng vì chúng là "giải pháp quản lý danh tính" toàn công ty, do đó, từ việc tìm kiếm tiếp thị trên trang web của họ, thật khó để biết chính xác giao thức nào đang được sử dụng và cách thức. Bạn sẽ cần phải liên hệ với họ để biết chi tiết.
Triển khai Kerberos trong Java không quá khó khăn vì các thư viện Java chuẩn hỗ trợ Kerberos thông qua các lớp org.ietf.gssapi. Tuy nhiên, cho đến gần đây đã có một trở ngại lớn - IE không gửi các mã thông báo Kerberos thô, nó sẽ gửi các thẻ SPNEGO. Nhưng với Java 6, SPNEGO đã được thực hiện. Về lý thuyết, bạn có thể viết một số mã GSSAPI có thể xác thực các trình khách IE. Nhưng tôi đã không thử nó. Việc Sun thực hiện Kerberos là một bộ phim hài lỗi trong những năm qua dựa trên hồ sơ theo dõi của Sun trong lĩnh vực này, tôi sẽ không hứa hẹn gì về việc thực hiện SPENGO cho đến khi bạn có con chim đó trong tay.
Đối với NTLM, có một dự án PMNM miễn phí được gọi là JCIFS có Bộ lọc Servlet xác thực HTTP NTLM. Tuy nhiên nó sử dụng một phương pháp man-in-the-middle để xác thực các thông tin đăng nhập với một máy chủ SMB không hoạt động với NTLMv2 (mà từ từ trở thành một chính sách bảo mật miền bắt buộc). Vì lý do đó và các lý do khác, phần Bộ lọc HTTP của JCIFS được lên lịch để xóa. Lưu ý rằng có một số spin-off sử dụng JCIFS để thực hiện cùng một kỹ thuật. Vì vậy, nếu bạn thấy các dự án khác yêu cầu hỗ trợ NTLM SSO, hãy kiểm tra bản in đẹp.
Cách chính xác duy nhất để xác thực thông tin đăng nhập NTLM với Active Directory đang sử dụng cuộc gọi NetRLogonSamLogon DCERPC qua NETLOGON với Kênh bảo mật. Liệu một điều như vậy tồn tại trong Java? Vâng.Ở đây là:
http://www.ioplex.com/jespa.html
Jespa là một thực hiện 100% Java NTLM hỗ trợ NTLMv2, NTLMv1, trọn vẹn và bảo mật tùy chọn và nêu trên NETLOGON xác nhận chứng chỉ. Và nó bao gồm một bộ lọc HTTP SSO, một JAAS LoginModule, HTTP client, SASL client và server (với JNDI binding), "nhà cung cấp bảo mật" chung để tạo các dịch vụ NTLM tùy chỉnh và hơn thế nữa.
Mike
'import com.sun.jndi.ldap.LdapCtxFactory;' - điều này rất có thể sẽ chỉ hoạt động với Sun JVM. Cập nhật –