【问题标题】:Tomcat Windows Authentication: JNDIRealm doesn't use SPNEGO delegated credentialsTomcat Windows 身份验证:JNDIRealm 不使用 SPNEGO 委托凭证
【发布时间】:2014-04-10 08:03:39
【问题描述】:

我们在 Linux 上运行 Tomcat 7.0.53,并且我们正在尝试使 Windows 身份验证按此处所述工作:https://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html#Tomcat_instance_%28Linux_server%29

SPNEGO 单独工作正常,它可以很好地验证用户。

然后我们将 JNDIRealm 与 LDAP 连接以获取用户角色,这就是问题所在。

在通过 SPNEGO 成功进行用户身份验证后,我们尝试在 JNDIRealm 中进行身份验证,似乎它没有使用 SPNEGO 的委托凭证,并且身份验证失败。 此外,当我们尝试使用 UserDatabaseRealm 而不是 JNDIRealm 并在 tomcat-users.xml 中设置具有相应角色的用户时,该 Realm 也不会使用这些凭据,并且身份验证再次失败。

卡特琳娜日志说:

Apr 09, 2014 1:56:46 PM org.apache.catalina.realm.CombinedRealm authenticate
FINE: Attempting to authenticate user "username@DEFAULT.REALM.RU" with realm 
"org.apache.catalina.realm.JNDIRealm/1.0"
Apr 09, 2014 1:56:46 PM org.apache.catalina.realm.CombinedRealm authenticate
FINE: combinedRealm.authFail
    [Krb5LoginModule]: Entering logout
    [Krb5LoginModule]: logged out Subject

下面列出了我们的配置文件。

kr5.ini:

[logging]
    default = FILE:/var/lib/tomcat/logs/krb5libs.log
    kdc = FILE:/var/lib/tomcat/logs/krb5kdc.log
    admin_server = FILE:/var/lib/tomcat/logs/kadmind.log

[libdefaults]
    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
    default_realm = DEFAULT.REALM.RU

[realms]
    DEFAULT.REALM.RU = {
        kdc = dc01-one.default.realm.ru:88
        default_domain = DEFAULT.REALM.RU
    }

[domain_realm]
    .DEFAULT.REALM.RU = DEFAULT.REALM.RU
    .default.realm.ru = DEFAULT.REALM.RU
    default.realm.ru = DEFAULT.REALM.RU

jaas.conf:

com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/appserver.default.realm.ru@DEFAULT.REALM.RU"
    useKeyTab=true
    keyTab="/var/lib/tomcat/conf/tomcat.keytab"
    storeKey=true
    debug=true;
};

com.sun.security.jgss.krb5.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/appserver.default.realm.ru@DEFAULT.REALM.RU"
    useKeyTab=true
    keyTab="/var/lib/tomcat/conf/tomcat.keytab"
    storeKey=true
    debug=true;
};

server.xml:

    <Realm className="org.apache.catalina.realm.JNDIRealm"
        debug="9"
        connectionURL="ldap://1.1.1.1:3268"
        connectionName="user_sys@default.realm.ru"
        connectionPassword="***"
        userBase="DC=****,DC=ru"
        userSearch="(&amp;(objectClass=user)(userPrincipalName={0}))"
        userRoleName="memberOf"
        userSubtree="true"
        roleBase="***"
        roleName="name"
        roleSubtree="true"
        roleSearch="(&amp;(objectClass=group)(member={0}))"
        referrals="follow"
        authentication="none"
        useDelegatedCredential="true"
        spnegoDelegationQop="auth"
        />
      </Realm>

应用程序上下文.xml:

<Valve 
    className="org.apache.catalina.authenticator.SpnegoAuthenticator"
    storeDelegatedCredential="true"
/>

应用程序 web.xml:

<login-config>
    <auth-method>SPNEGO</auth-method>
</login-config>

使用 FORM auth-method 时,JNDIRealm 配置(虽然没有最后 3 个参数 - authentication、useDelegatedCredential 和 spnegoDelegationQop)工作得很好

我们尝试使用 SPNEGO SourceForge,将 SPNEGO 用作 HttpFilter 或 Valve,但也没有成功。

这个配置有什么问题吗?我们如何让 JNDIRealm 使用 SPNEGO 委托凭证?

【问题讨论】:

    标签: java tomcat active-directory windows-authentication spnego


    【解决方案1】:

    我们自己解决了这个问题。问题出在 JNDIRealm 的 stripRealmForGss 参数中——要么省略它(如我们的例子),要么将其设置为 true,使 JNDIRealm 尝试连接到空主机。当我们设置 stripRealmForGss="false" 时,突然间一切都变得像魅力一样。

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 2018-12-10
      • 2010-11-28
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      相关资源
      最近更新 更多