我们在 Windows 2008 服务器上的 IIS 7 中部署了一个 .NET MVC 3 应用程序(我们称之为 PROD)。该应用程序启用了匿名和 Windows 身份验证 - 所有其他身份验证均已禁用。applicationHost.config 中指定的身份验证提供程序依次为 Negotiate 和 NTLM。
最近,我们开始遇到此应用程序中的身份验证问题。用户(与服务器位于不同的域中)使用 IE 连接时,如果选中“启用集成 Windows 身份验证”选项,则会收到“未授权。HTTP 错误 401。请求的资源需要用户身份验证。”消息,即使他们提供了有效的凭据。从 Firefox 访问应用程序时不会出现此问题。此外,当使用 IE 时,如果未选中“启用集成 Windows 身份验证”,则一切正常。
从我在互联网上读到的类似问题来看,我发现我们遇到了一些 Kerberos 配置不正确的问题。事实证明,NTLM 身份验证工作正常。我检查了 SPN,它们似乎配置正确(由于我们的应用程序是通过服务器的 netBios 名称访问的,因此存在默认配置)。
有趣的是,我们有另一台服务器(我们称之为 DEV),它托管完全相同的应用程序,并且位于完全相同的域中,具有相同的身份验证和身份验证提供程序配置,并且应用程序池在相同的帐户下运行,并且那里的身份验证工作正常。唯一的区别是 PROD 最近安装了 .NET 4,但我不认为这可能是一个问题。此外,PROD 在 IIS 中的以下虚拟目录中托管此应用程序:Sites/XYZ/XYZ,以便您通过 url 访问该站点http://server:8666/XYZ
。DEV 上的应用程序直接在 IIS 的 Sites/XYZ 中托管,并通过 url 访问http://server2:8666
。
您能否告诉我我还可以检查什么?我尝试打开 Kerberos 日志记录,但在尝试访问应用程序后在事件查看器中未找到任何日志。我不知道该在哪里查找以及检查什么。
答案1
首先,我要确认这种情况是否发生在客户端,其中 IE 显示该站点位于受信任的站点区域,并且受信任的站点区域配置为“使用当前用户名和密码自动登录”。
接下来,我怀疑 http 授权标头大小可能超出 IIS 限制。集成 Kerberos 授权很容易受到此问题的影响,因为 IIS 限制实际上相当低,并且不需要太多组成员身份即可使令牌超出限制。
每个请求都在 http 授权标头中包含用户的 Kerberos 令牌。由于令牌经过编码,因此它通常比实际使用的内存大得多。
您可以使用以下文档增加值:
Windows 的 Http.sys 注册表设置
http://support.microsoft.com/kb/820129
我将使用以下值:
MaxRequestBytes-设置为1048576
MaxFieldLength-设置为65534
另一个有用的实用程序 DelegConfig。您可以将其作为应用程序放在任何网站上,然后连接以获取有关如何配置 Kerberos 身份验证的有用报告。这需要作为受害者帐户进行测试(或在受害者域中表现出症状的适当配置的测试帐户)。
您可能还需要查看:
如何在配置 Internet Information Services 上承载的 Web 应用程序时使用 SPN
http://support.microsoft.com/kb/929650
具体来说:
“在 Active Directory 中,验证是否已清除访问该应用程序的用户的“帐户是敏感的且不能委派”复选框。”
“验证参与 Kerberos 进程的所有计算机是否具有一致的名称解析并通过 Kerberos 信任进行连接。例如,验证参与 Kerberos 进程的计算机是否位于同一林中或属于跨林 Kerberos 信任。”
“验证令牌大小不超过为 MaxTokenSize 属性设置的值。”(MaxTokenSize 应设置为 65535)。
Internet Explorer 6 无法使用 Kerberos 身份验证协议连接到使用非标准端口的网站
http://support.microsoft.com/kb/908209
下面的文章中也有一些很好的提示。
具体来说,使用 NetMon 或 KerbSpy 检查客户端是否连接到预期的 SPN。