IIS 7 中的 Kerberos 身份验证

Posted

技术标签:

【中文标题】IIS 7 中的 Kerberos 身份验证【英文标题】:Kerberos authentication in IIS 7 【发布时间】:2011-04-16 02:10:10 【问题描述】:

我们有一些使用集成 Windows 身份验证在虚拟目录中设置的 Web 内容。虚拟目录在使用自定义身份(自定义用户帐户)的应用程序池下运行。问题是 NTLM 身份验证有效,但 Kerberos 身份验证无效。这是在 IIS 6 下工作的相同配置,但我们需要迁移到 IIS 7 并且 Kerberos 身份验证不起作用。

以下是有关我的环境的更多信息:

虚拟目录身份验证设置:

除 Windows 身份验证外,所有功能均已禁用 启用内核模式身份验证:已启用

应用程序池设置:

托管管道模式:经典 身份:自定义本地用户

Web.config 设置:

身份验证模式 = "Windows" system.serviceModel/bindings/basicHttpBinding/binding/security/mode = TransportCredentialOnly system.serviceModel/bindings/basicHttpBinding/binding/security/transport/clientCredentailType = Windows serviceHostingEnvironment/aspNetCompatibilityEnabled = true

虚拟目录权限:

自定义本地组:我们将域用户添加到本地组以访问服务

操作系统设置:

IIS 7 Windows Server 2008 x64 标准 SP2

这是我从 fiddler 那里得到的比较 IIS 6 和 IIS 7 的分析。Kerberos 身份验证在 IIS 6 中运行良好,应用程序池以自定义身份运行。

参考(IIS 6)(作品):

提琴手:

(使用域\用户)

请求 1(无身份验证)

No Proxy-Authorization Header is present.
No Authorization Header is present.

响应 1 (401)(挑战)

No Proxy-Authenticate Header is present.
WWW-Authenticate Header is present: Negotiate
WWW-Authenticate Header is present: NTLM

请求 2(Kerberos 票证)

Authorization Header (Negotiate) appears to contain a Kerberos ticket:
<data>

响应 2 (401)(Kerberos 回复)

WWW-Authenticate Header (Negotiate) appears to be a Kerberos reply:
<data>

请求 3(Kerberos 票证)

Authorization Header (Negotiate) appears to contain a Kerberos ticket:
<data>

响应 3 (401)(Kerberos 回复)

WWW-Authenticate Header (Negotiate) appears to be a Kerberos reply:
<data>

请求 4(Kerberos 票证)

Authorization Header (Negotiate) appears to contain a Kerberos ticket:
<data>

响应 4 (200)(Kerberos 回复)

WWW-Authenticate Header (Negotiate) appears to be a Kerberos reply:
<data>

交易完成,浏览器显示页面。


(IIS 7)(不起作用):

提琴手:

(使用域\用户)

请求 1(无身份验证)

No Proxy-Authorization Header is present.
No Authorization Header is present.

响应 1 (401)(协商)

No Proxy-Authenticate Header is present.
WWW-Authenticate Header is present: Negotiate
WWW-Authenticate Header is present: NTLM

请求 2(Kerberos 票证)

Authorization Header (Negotiate) appears to contain a Kerberos ticket:
<data>

响应 2 (401)(协商)

No Proxy-Authenticate Header is present.
WWW-Authenticate Header is present: Negotiate
WWW-Authenticate Header is present: NTLM

请注意,IIS 7 在响应 2 中不接受我的 Kerberos 票证。知道为什么不?我是否需要重新配置 IIS 7 中的某些内容才能使 Kerberos 身份验证正常工作?

【问题讨论】:

【参考方案1】:

分辨率

为了让 IIS 7 像 IIS 6 一样协商身份验证,我必须将 applicationHost.config 文件中我的虚拟目录的 windowsAuthentication 元素的 useAppPoolCredentials 设置为 true。这是通过执行以下任一命令完成的:

%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/security/authentication/windowsAuthentication -useAppPoolCredentials:true

申请个人申请:

第一次解锁:

%windir%\system32\inetsrv\appcmd.exe unlock config /section:windowsAuthentication

然后申请:

%windir%\system32\inetsrv\appcmd.exe set config "Default Web Site/myApp/" /section:windowsAuthentication -useAppPoolCredentials:true

注意 - 这实际上不会使 Kerberos 工作。它使 IIS 7 的行为类似于 IIS 6。这意味着如果服务器和客户端之间的 Kerberos 协商失败,那么服务器会自动回退到 NTLM。这实际上是使身份验证为我工作的原因 (NTLM)。

【讨论】:

哇哦..谢谢!!我搜索了很多 SO 文章(以及网络上的其他地方),这终于解决了我的问题。【参考方案2】:

您是否使用 Negotiate:Kerberos 提供程序进行 Windows 身份验证?如果 Kerberos 存在问题,您可以通过在客户端上运行Network Monitor(或类似WireShark)在尝试进行身份验证时获得有关该问题的更多详细信息。查看 Internet Explorer 进程中的消息,您可能会看到一些 Kerberos 运行情况。

【讨论】:

以上是关于IIS 7 中的 Kerberos 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Windows 集成 (NTLM) 身份验证与 Windows 集成 (Kerberos)

在 IIS 中禁用匿名身份验证后 WebServiceHost 无法正常工作

IIS 7.5 中的 Windows 身份验证失败

Kerberos无法使用Chrome

使用 Powershell 3.0 切换 IIS 7.5 身份验证“匿名身份验证”?

如何让 Tomcat 中的 JNDIRealm 使用 Kerberos 身份验证?