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 无法正常工作