Tomcat 6 使用 SPNEGO SSO 仍然提示输入登录名和密码

Tomcat 6 with SPNEGO SSO still prompts for login and password

我正在尝试使用 SPNEGO filter.

为 Tomcat (6) 设置 Windows Active Directory SSO

我已经按照示例进行了设置,但是当我尝试访问 hello_spnego.jsp.

时,系统仍然提示我输入登录名和密码

我可能遗漏了什么,所以这是我的配置文件:

web.xml(与 spnego 相关):

<filter>
    <filter-name>SpnegoHttpFilter</filter-name>
    <filter-class>net.sourceforge.spnego.SpnegoHttpFilter</filter-class>
    <init-param>
        <param-name>spnego.allow.basic</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.allow.localhost</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.allow.unsecure.basic</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.login.client.module</param-name>
        <param-value>spnego-client</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.login.server.module</param-name>
        <param-value>spnego-server</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.krb5.conf</param-name>
        <param-value>${catalina.home}\conf\krb5.conf</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.login.conf</param-name>
        <param-value>${catalina.home}\conf\login.conf</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.preauth.username</param-name>
        <param-value>aqw</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.preauth.password</param-name>
        <param-value>pass</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.prompt.ntlm</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>spnego.logger.level</param-name>
        <param-value>1</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SpnegoHttpFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

krb5.conf :

    [libdefaults]
default_realm = TEST.LOCAL
default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
forwardable=true

[realms]
TEST.LOCAL = {
    kdc = SERVER_WITH_AD:88
    default_realm = TEST.LOCAL
}

[domain_realm]
dev.local = TEST.LOCAL
.dev.local = TEST.LOCAL

login.conf :

spnego-client {
    com.sun.security.auth.module.Krb5LoginModule required;
};

spnego-server {
    com.sun.security.auth.module.Krb5LoginModule required
    storeKey=true
    isInitiator=false
    useKeyTab=true
    keyTab="C:\Osys\QuartisTools\Tomcat\conf\aqw.keytab"
    ;
};

编辑:这是我所做的:

附加信息:
- SERVER_WITH_AD 运行 Windows Server 2012 (x64)。
- TOMCAT_SERVER 运行 Windows 7 Ultimate (x64)。

编辑 2: 按照 Whome 的建议,我将地址添加到受信任站点的列表中。

有时我不再看到 username/login 提示,但我现在在 Tomcat 中收到错误(显示为 HTTP 500 错误):
KrbException:参数无效 (400) - 找不到适当类型的密钥来解密 AP REP - AES256 CTS 模式与 HMAC SHA1-96
所以它可能找不到我的密钥表。

出现 "cannot find key" 错误后,我重新阅读了我的 conf 文件,并根据 Whome 的建议将文件名命名为 Unix 风格。然后我将它们移动到 conf 文件旁边,以获得尽可能短的路径。我还添加了一个主体,as in the server keytab testing procedure described here:,所以我的 login.conf 是:

spnego-client {
    com.sun.security.auth.module.Krb5LoginModule required;
};

spnego-server {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="appserver.keytab"
    principal=aqw
    storeKey=true;
};  

这给了我一个校验和错误,所以我重新生成了我的 keytab 文件。

这又显示了一个不同的错误:
javax.security.auth.login.LoginException: 没有可用的 CallbackHandler 来从用户那里获取身份验证信息

所以我编辑了 web.xml 以允许不安全的、基本的、NTLM 提示符和本地主机。像这样:

    <init-param>
        <param-name>spnego.prompt.ntlm</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.basic</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.localhost</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.unsecure.basic</param-name>
        <param-value>true</param-value>
    </init-param>

奇怪的是,它显示了另一个异常:
javax.security.auth.login.LoginException: 没有可用的 CallbackHandler 来从用户那里获取身份验证信息

我说得很奇怪,因为我的理解是通过允许 NTLM 提示我授权另一个方法进行身份验证。

最奇怪的是今天早上,它起作用了。我不知道为什么。重新启动我的服务器后它仍然有效。我收到了正确用户的 "Hello user!" 消息。但是 the HelloKeytab test class 不起作用。

编辑:最后,它停止工作并且无法正常工作。我一直收到校验和错误。所以我最终使用了 Waffle.