我试图使用新加坡国家邮政局servlet 过滤器和 8080 的监听端口,用于在运行 IIS7 中托管的 Web 应用程序的主机上进行身份验证。
我按照 SPNEGO 安装说明进行操作,为 创建了一个 SPN HTTP/canonical.host.name
,并将其绑定到执行 Java 服务身份验证的用户。
进行此更改后,Java 服务能够通过 SPNEGO 对客户端进行身份验证,但使用自定义身份(即用户名而不是 ApplicationPoolIdentity)运行的 IIS7 应用程序池突然无法进行身份验证。
我不明白的是:
- 当没有
HTTP/canonical.host.name
定义使用 SPN(通过 检查setspn -Q
)时,Kerberos 身份验证如何为 IIS 工作?客户端仍会请求并接收与此 SPN 完全相同的票证。 - 出于兴趣,我们尝试使用成功验证身份的 Java 服务的身份运行应用程序池。只要定义了 SPN,它仍然不起作用 - 使用 Kerberos 票证进行身份验证的尝试失败并返回
KRB_AP_ERR_MODIFIED
。以 SPN 注册到的用户身份运行应用程序池不会改变此行为。 - 微软指定SPN 包含端口号,但 IE 不符合此规定,并且从不在 SPN 中发送端口号(Firefox 和 Chrome 遵循此行为)。
那么,有没有办法在同一台主机上拥有多个独立的SPNEGO认证服务?
答案1
最后首先:对于同一主机上的多个经过 SPNEGO 认证的服务,无需摆弄 IE 注册表项,使用不同的名称。
•当没有使用(通过 setspn -Q 检查)定义 HTTP/canonical.host.name 的 SPN 时,Kerberos 身份验证如何对 IIS 进行工作?客户端仍会请求并接收与此 SPN 完全相同的票证。
这是基于HOST\boxname
SPN 的自动回退,该 SPN 是在加入域时为所有计算机创建的 - 如果 DC 未找到客户端应用程序请求的 SPECIFICSERVICE\boxname 的匹配项,它将根据 HOST\boxname 提供票证。
用于SETSPN -L boxname
列出与安全主体(用户或计算机帐户)关联的 SPN。
•出于兴趣,我们尝试使用成功通过身份验证的 Java 服务的身份运行应用程序池。只要定义了 SPN,它仍然不起作用 - 使用 Kerberos 票证进行身份验证的尝试失败,并返回 KRB_AP_ERR_MODIFIED。以注册了 SPN 的用户身份运行应用程序池不会改变此行为。
IIS 7 的默认设置是 useAppPoolCredentials=false 和 useKernelMode=true ;必须切换其中一个或两个,以便使用应用程序池标识来解码 kerberos 票证。
•Microsoft 指定 SPN 包含端口号,但 IE 并不符合此规定,并且从不在 SPN 中发送端口号(Firefox 和 Chrome 遵循此行为)。
回到问题的真正关键:当其他一切都已修复时,IE 和其他浏览器仍然不会默认包含端口号,因此最少修改的解决方案就是在同一个盒子上运行不同的主机头。
还要注意,由于另一种 IE 行为(同样的论点反对更改所有客户端的注册表设置),CNAME 不是一个好的选择,请改用 A 记录。
答案2
您是否已从此知识库中获得注册表项http://support.microsoft.com/default.aspx?scid=kb;EN-US;908209在客户端上配置了什么?否则 IE 不会请求正确的票证。需要说明的是,注册表项随 IE6+hotfix 一起提供,但适用于此后的所有 IE 版本。
我不确定我是否理解了您的配置。在用于“Java 服务”的服务帐户上配置的 HTTP/canonical.host.name SPN 是否正确?
您可以使用不同的身份在机器上运行多个服务。因此,您可以在同一台主机上同时运行名为 HTTP/host1.host.name 和 HTTP/host2.host.name 的服务。如果您愿意,您可以在同一个服务帐户或不同的服务帐户上注册所涉及的 SPN。
如果未在任何地方明确设置 HTTP SPN,则 HTTP SPN 请求将映射到具有基于 HOST 的 SPN 的对象。此映射通过对象上的 SPNMappings 属性进行,该属性类似于 CN=Directory Service、CN=Windows NT、CN=Services、CN=Configuration、DC=forest1、DC=local(此处的 forest1.local 是林名称),具体如下:http://msdn.microsoft.com/en-us/library/cc220898(v=PROT.13).aspx。
Tristan 的博客很棒。您还可以在以下位置找到故障排除博客和其他与 Kerberos 相关的博客http://blogs.technet.com/b/askds/archive/tags/kerberos/有用。