【问题标题】:Optional kerberos authentication?可选的kerberos身份验证?
【发布时间】:2014-03-30 17:52:26
【问题描述】:

是否可以进行可选的 kerberos 身份验证?

我想要的是:如果客户端(浏览器)不在域上,它将被重定向到用户名/密码 Web 登录。否则它会做 SPNEGO 做 Kerberos 认证。

有什么解决办法吗?如果是,我们需要哪些配置?

【问题讨论】:

  • 您还没有说明 Web 服务器环境是什么。我知道如何在 linux 上为 Apache 执行此操作,但这可能与您的环境无关。

标签: kerberos spring-security-kerberos


【解决方案1】:

是的。你可以这样做。当服务器收到未经身份验证的请求时,它会回复一个 401(“需要授权”),这是一个标头 WWW-Authenticate 设置为 Negotiate。如果 Kerberos 身份验证失败,服务器也会返回 401。

每当客户端验证失败时(例如,如果它没有任何 Kerberos 凭据,或者验证失败),就会显示 401 页面内容。

所以,要解决您的问题,您所要做的就是在 401 页面中包含登录页面。

【讨论】:

    【解决方案2】:

    如果您需要在服务器收到未经身份验证的请求后重定向到登录页面(如 Elias Mårtenson 所说),您需要像这样配置 spring security:

    springSecurity.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:sec="http://www.springframework.org/schema/security"
            xmlns:context="http://www.springframework.org/schema/context"
            xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    
    <sec:http entry-point-ref="spnegoEntryPoint" >
        <sec:custom-filter ref="spnegoAuthenticationProcessingFilter" position="BASIC_AUTH_FILTER" />
        <sec:form-login login-page="/login.xhtml" default-target-url="/index.xhtml" />
        <sec:access-denied-handler error-page="/login.xhtml" />
    </sec:http>
    
    <bean id="spnegoAuthenticationProcessingFilter" class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter"> 
        <property name="authenticationManager" ref="authenticationManager" />
    </bean>
    
    <sec:authentication-manager alias="authenticationManager">
        <sec:authentication-provider ref="kerberosServiceAuthenticationProvider" /> <!-- Used with SPNEGO -->
        <sec:authentication-provider ref="kerberosAuthenticationProvider"/> <!-- Used with form login -->
    </sec:authentication-manager>
    
    <bean id="kerberosAuthenticationProvider" class="org.springframework.security.extensions.kerberos.KerberosAuthenticationProvider">
        <property name="kerberosClient">
            <bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosClient">
                <property name="debug" value="true"/>
            </bean>
        </property>
        <property name="userDetailsService" ref="customUserDetailsService"/>
    </bean>
    
    <bean id="kerberosServiceAuthenticationProvider" class="ru.rfcfefa.epod.common.base.interceptor.CustomKerberosServiceAuthenticationProvider">
        <property name="ticketValidator">
            <bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator">
                <property name="servicePrincipal" value="HTTP/serverName.domain.local" />
                <!-- Setting keyTabLocation to a classpath resource will most likely not work in a Java EE application Server -->
                <!-- See the Javadoc for more information on that -->
                <property name="keyTabLocation" value="http-server.keytab" />
                <property name="debug" value="true" />
            </bean>
        </property>
        <property name="userDetailsService" ref="customUserDetailsService" />
    </bean>
    
    <bean class="org.springframework.security.extensions.kerberos.GlobalSunJaasKerberosConfig">
        <property name="debug" value="true" />
        <property name="krbConfLocation" value="krb5.conf"/>
    </bean>
    </beans>
    

    krb5.conf

    [libdefaults]
        default_realm = DOMAIN.LOCAL
        default_tkt_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
        default_tgs_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
        permitted_enctypes   = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    
    [realms]
        DOMAIN.LOCAL  = {
            kdc = serverAD.domain.local 
            default_domain = DOMAIN.LOCAL
    }
    
    [domain_realm]
         .DOMAIN.LOCAL = DOMAIN.LOCAL
    

    • HTTP/serverName.domain.local - 服务主体名称
    • http-server.keytab - 生成的keytab文件(见MIKE WIESNER blogLior Chaga experience
    • 小心 keyTabLocation 属性,它不是 .keytab 文件的路径,它是 .keytab 文件的 URL,所以使用 file:/ 来定位
    • krbConfLocation - 系统上 kerberos 配置文件 krb5.conf 的路径
    • customUserDetailsS​​ervice - 您的自定义 detailService
    • 不要忘记在生产中将属性 debug 设置为 false

    【讨论】:

      【解决方案3】:

      如果您使用的是 Apache,则可以调整 Cosign 模块以使用(正常的、带内身份验证)登录页面上的一些 JavaScript 以及通过 Kerberos 身份验证的登录控制器的第二个路径来执行此操作。 “常规”登录表单测试访问受 Kerberos 保护的资源是否成功,如果成功则重定向浏览器以自动完成登录。

      在我看来,上述内容似乎有点倒退,并且在并非绝对必要的情况下添加 JavaScript 要求是令人反感的。我认为 Elias Mårtenson 的回答是正确的 - 尝试 Kerberos 并在 HTTP 401 响应中回退到带内登录 - 但是否可能取决于您的环境。

      【讨论】:

        猜你喜欢
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 2017-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多