在Sping Boot 应用程序中,我想对Active Directory执行身份验证。作为预先信息,以下的Webldapsearch正在工作并按预期提供信息:
ldapsearch -D "cn=boss,ou=admin,dc=example,dc=com" -w pw1234 -h ldap.example.com -p 389 -b "ou=students,dc=example,dc=com" "[email protected]"
字符串
因此,在yaml-configuration中,我设置了ldap上下文源,如下所示:
spring.ldap.base: "dc=example,dc=com"
spring.ldap.urls: "ldap://ldap.example.com:389"
spring.ldap.username: "cn=boss"
spring.ldap.password: "pw1234"
型
此设置适用于使用Spring的BindAuthenticator
的本地OpenDJ安装,但现在我正在尝试对真实的世界Active Directory
进行身份验证。为此,我设置了ActiveDirectoryLdapAuthenticationProvider
:
@Bean
public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
ActiveDirectoryLdapAuthenticationProvider provider =
new ActiveDirectoryLdapAuthenticationProvider("", "ldap://ldap.example.com:389");
// provider.setSearchFilter("(uid={0})"); // do I need this?
return provider;
}
型
不幸的是,我得到的是以下错误:
ActiveDirectoryLdapAuthenticationProvider: Authentication for [email protected] failed:javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090439, comment: AcceptSecurityContext error, data 52e, v4563 ]
ActiveDirectoryLdapAuthenticationProvider: Active Directory authentication failed: Supplied password was invalid
型
我没有得到任何进一步的信息,比如与manager-dn(cn=boss)的初始绑定是否成功,但我假设,还有更多的东西要配置,我只是不知道。也许我必须在某个地方显式地设置manager-dn
和manager-password
,但如果是这样,在哪里?
有人知道从哪里开始解决这个问题吗?
编辑:
按照要求,这里是ldapsearch的最重要的结果:
dn:: Q049MmFiZWUgc3R1ZGVudCA0MiAzNDQyMDEwMTk2LE9VPXN0dWRlbnRzLERDPWV4YW1wbGUsREM9Y29t
cn: 2abee student 42 3442010196
description: 3442010196
displayName: 42 student (2abee)
distinguishedName:: Q049MmFiZWUgc3R1ZGVudCA0MiAzNDQyMDEwMTk2LE9VPXN0dWRlbnRzLERDPWV4YW1wbGUsREM9Y29t
generationQualifier: 3442010196
givenName: 42
mail: [email protected]
memberOf:: Q049MmFiZWUsT1U9c3R1ZGVudHMsREM9ZXhhbXBsZSxEQz1jb20=
name: 2abee student 42 3442010196
sn: student
sAMAccountName: [email protected]
userPrincipalName: [email protected]
登录表单中输入的凭据为:username: [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)
password: secret
1条答案
按热度按时间xggvc2p61#
cn
属性存在于Active Directory中,但您需要将可分辨名称(dn
)放入配置中,与您在ldapsearch
命令行中使用的名称相同。字符串
现在ActiveDirectoryLdapAuthenticationProvider类中的默认搜索是
(&(objectClass=user)(userPrincipalName={0}))
。这意味着用户需要输入他们的userPrincipalName
属性的值。将其更改为(uid={0})
(与setSeachFilter
)将不起作用,保留默认值。你得到的异常在第229行抛出。阅读代码,看起来像这样:
doAuthentication
接收用户名和密码bindAsUser
不会搜索,但会尝试使用提供的用户名和密码登录。1.它无法登录,因此引发异常。您确定您的密码正确吗?
换句话说,代码的行为如下:
型
代码中没有使用
spring.ldap.username
和spring.ldap.password
。您可以删除它们,您将得到相同的错误。Simple bind over a non-encrypted connection is often blocked,但它看起来对你有用。你还是应该使用LDAPS.