[英]Java LDAP authentication with username
好吧,這讓我發瘋了。 我正在嘗試使用 Java 創建一個 LDAP 身份驗證,如果我在 SECURITY_PRINCIPAL 中使用我的名字和姓氏,一切都很好。 這是我的代碼:
try {
Hashtable<String, String> ldapEnv = new Hashtable<String, String>();
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ldapEnv.put(Context.PROVIDER_URL, "LDAP://myldap.mydomain.com:389");
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, "CN=FirstName LastName" + ",ou=Users");
ldapEnv.put(Context.SECURITY_CREDENTIALS, "password");
DirContext ldapContext = new InitialLdapContext(ldapEnv, null);
}
catch (Exception e) {
System.out.println(" bind error: " + e);
e.printStackTrace();
}
問題是它不適用於我的用戶名。 如果我嘗試:
ldapEnv.put(Context.SECURITY_PRINCIPAL, "CN=myusername" + ",ou=Users");
或者
ldapEnv.put(Context.SECURITY_PRINCIPAL, "uid=myusername" + ",ou=Users");
我總是得到[LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1
]
出於某種原因,這似乎只適用於我的名字和姓氏。 我檢查了廣告,我的 sAMAccountName 是我正確的用戶名。 不知道為什么會這樣。 其他人有這樣的問題嗎? 我可以將其他內容傳遞給 Context.SECURITY_PRINCIPAL 嗎? 我試過ldapEnv.put(Context.
, "sAMAccountName=myusername" + ",ou=Users");
但它也失敗了......有人可以幫忙嗎?
EJP,感謝您的意見。 您確實是正確的,但我正在尋找一些簡單的東西 - 只需將用戶名和密碼傳遞給 AD 並查看它是否經過身份驗證。我應該在我的第一篇文章中更具體。 你的建議會奏效,但我認為這要簡單得多:
Hashtable props = new Hashtable();
String principalName = "username@mydomain.com";
props.put(Context.SECURITY_PRINCIPAL, principalName);
props.put(Context.SECURITY_CREDENTIALS, "mypassword");
DirContext context;
//try to authenticate
try {
context = com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance("LDAP://myldap.mydomain.com:389" + '/', props);
context.close();
}
這樣我就不關心DN了。 只需傳遞用戶名@域和瞧 - 就像一個魅力:) 再次感謝!
沒有其DN
包含UID
或CN=username
的條目。 您必須提供一個存在的條目,而不僅僅是任意屬性字符串。 通常的技術是綁定為管理員用戶,搜索具有該UID
的用戶或他提供給您的登錄系統的任何內容,檢索該用戶的DN
,然后嘗試使用用戶提供的密碼綁定為該DN
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.