Spring Security Active Directory 错误凭据处理(错误 49)

Posted

技术标签:

【中文标题】Spring Security Active Directory 错误凭据处理(错误 49)【英文标题】:Spring Security Active Directory bad credentials handling (error 49) 【发布时间】:2015-12-04 09:37:12 【问题描述】:

我在简单的 Spring Web 应用程序中遇到 Active Directory 身份验证问题。我正在使用ActiveDirectoryLdapAuthenticationProvider,它似乎适用于空登录字段和正确的凭据。问题在于无效的凭据(错误的登录名/密码或两者兼而有之)。应用程序向浏览器抛出异常(错误 500):

Error processing request
Context Path: /MYAPPNAME
Servlet Path: /login_check
Path Info: null
Query String: null
Stack Trace:
org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: JBAS011843: Failed instantiate InitialContextFactory com.sun.jndi.ldap.LdapCtxFactory from classloader ModuleClassLoader for Module "deployment.MYAPPNAME.war:main" from Service Module Loader [Root exception is javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece]] (...)

控制台根错误是:

javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308:
LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece]

如果凭据不正确,Spring 不应该将用户发送到 authentication-failure-url 吗?我没有任何“经理”帐户可用于 ldap BIND,我相信 ActiveDirectoryLdapAuthenticationProvider 应该使用登录表单中的凭据进行绑定。 Spring 文档没有任何关于绑定到 AD 的内容。

这可能可以使用自定义身份验证提供程序来解决,但我希望有一个开箱即用的解决方案。有一些类似的问题,但没有一个非常精确,也没有任何有用的答案。

如何处理这个错误?

有没有办法在 XML 中配置它?也许,告诉 AD 提供者将绑定错误视为登录尝试失败?

自定义身份验证提供程序是唯一的解决方案吗?


spring-security.xml

<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter">
    <property name="rolePrefix" value="" />
</bean> 
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
    <constructor-arg name="decisionVoters" ref="roleVoter" />
</bean>
<s:http authentication-manager-ref="ldap-auth" access-decision-manager-ref="accessDecisionManager" use-expressions="false">
    <s:intercept-url pattern="/list**" access="ADGROUP-XYZ" />
    <s:form-login 
        login-page="/login"             
        login-processing-url="/login_check"
        username-parameter="username" 
        password-parameter="password"     
        default-target-url="/list"
        authentication-failure-url="/login?fail" />
    <s:logout 
        invalidate-session="true" 
        logout-success-url="/login?logout" 
        logout-url="/logout"
        delete-cookies="JSESSIONID" />
    <s:csrf />
</s:http>    

<s:authentication-manager id="ldap-auth">
    <s:authentication-provider ref="adAuthenticationProvider" />
</s:authentication-manager> 

<bean id="adAuthenticationProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <constructor-arg value="company.local" />
    <constructor-arg value="ldap://server.company.local:389/" />
    <property name="useAuthenticationRequestCredentials" value="true"/>
    <property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>

编辑:一个丑陋的解决方法是覆盖 ActiveDirectoryLdapAuthenticationProvider 并将 throw LdapUtils.convertLdapException(e); 更改为 throw badCredentials(e);

【问题讨论】:

【参考方案1】:

JBoss EAP 初始上下文存在问题。这已在最新的 Wildfly 版本中修复。请查看以下链接

https://jira.spring.io/browse/SEC-2754

https://issues.jboss.org/browse/WFLY-4149

【讨论】:

您可以尝试使用 url jira.spring.io/browse/SEC-2754 中给出的示例代码来解决此问题

以上是关于Spring Security Active Directory 错误凭据处理(错误 49)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Active Directory 错误凭据处理(错误 49)

Spring Security Active Directory LDAP 身份验证错误

Spring Security 3.1:Active Directory 身份验证和本地 DB 授权

具有 Active Directory 和数据库角色的 Spring Security

Spring Security - 在Spring Boot中针对LDAP使用Active Directory对用户进行身份验证

Spring Security 3 Active Directory 身份验证、数据库授权