解决 IIS7.5 和 Windows 身份验证的访问问题

解决 IIS7.5 和 Windows 身份验证的访问问题

我正在 IIS 7.5 服务器(Win Server 2008 R2)上安装 Web 应用程序,但遇到了 Windows 身份验证问题。我已经安装过几十次了,但这一次让我很为难,所以非常欢迎大家提出建议。

概括

只有管​​理员可以通过 Windows 身份验证连接到我的网站,但我希望所有用户都经过身份验证。管理员既可以通过本地主机从计算机进行连接,也可以从另一个工作站进行连接。其他用户会被提示输入凭据,而不是自动进行身份验证,并且被拒绝访问。尽管每个人都拥有对 Web 目录的完全控制权,但情况仍然如此。

详细场景

  • 使用作为网络服务运行的应用程序池创建 Web 应用程序。启用 Windows 身份验证,禁用所有其他身份验证。Windows 身份验证的内核模式 =true(即 IIS 默认模式),提供程序的顺序为 NTLM、协商(尽管我也尝试过反过来)。所有登录名都在同一个域中,并且 Web 服务器也在该域中。

  • 应用程序安装在C:\MyApplication\App\

  • 当登录到服务器(作为管理员帐户)时,我可以导航到http://localhost/MyApp并自动进行身份验证。

  • 当我登录到服务器(作为管理员帐户)时,系统http://webserver.full.domain.com/MyApp会提示我输入凭据。输入 3 次后,我得到了 401.1 未授权页面。

  • 当我以普通用户帐户登录到工作站并导航到时,系统提示http://webserver/MyApp我输入凭据 3 次,然后显示“访问被拒绝”消息。

  • 当以服务器上可用的管理员帐户登录工作站时,我也可以导航到http://webserver/MyApp并自动进行身份验证。使用其他帐户登录不起作用。这对我来说似乎特别奇怪,表明这只是关于权限......但权限似乎没问题?!

  • 即使按照以下说明启用了详细的 Kerberos 日志记录,安全事件日志中也没有记录任何故障:本文

  • SPN 似乎设置正确,因为我从另一台机器使用了“setspn -L servername”并看到了两个条目HOST/servernameHOST/servername.full.domain.com

  • 服务器上还有另一个应用程序以 NETWORK SERVICE 身份运行,在 IIS 中使用匿名身份验证,然后使用 SQL Integrated Security 连接到 SQL Server。它不使用模拟,因此以计算机身份连接到 SQL Server。DOMAIN\SERVER$这工作正常。我提到这一点是因为它表明该机器在域上没有根本问题,因为它的身份被 SQL Server 接受。

  • 我已授予 NETWORK SERVICE 对应用程序所在的 Web 服务器文件夹的完全控制权 ( C:\MyApplication\)。我已授予经过身份验证的用户读取/列出/执行权限。工作站上的 Internet Explorer 正确识别http://webserver/MyApp为位于 Intranet 区域

  • Internet Explorer 已启用 Windows 身份验证。

  • 我还尝试创建另一个虚拟目录C:\MyApplication\test,其中包含一个文件 test.html,也仅启用了 Windows 身份验证并具有适当的权限。同样的症状,但我得到的是 401.2 未授权,而不是 401.1。

  • 服务器最初没有安装 IIS 角色,因此我添加了它。我第一次忘记选择“Windows 身份验证”,因此当我尝试为我的应用程序打开 Windows 身份验证时添加了此角色服务。

  • 当我最初安装 IIS 角色并导航到http://localhost默认应用程序池时,它停止了,并向我显示了服务器故障消息。将默认应用程序池切换为作为网络服务运行解决了这个问题。我现在想知道这是否意味着服务器上存在其他问题,可能导致我的身份验证问题。例如此修补程序,尽管作为网络服务运行时这不会影响我。

  • 重启服务器并重新测试,以防万一。没有运气。

  • 创建了一个测试文件c:\inetpub\wwwroot\testwwwroot\test.html,仅在网站上设置了 Windows 身份验证,并尝试从工作站访问它。同样的症状。因此,这是一个适用于 wwwroot 以及其他文件夹的问题。

  • 授予每个人对该文件夹的完全控制权并重新测试,仍然无权访问。

  • 授予最终用户对文件夹的完全控制权并重新测试,仍然无法访问权限。

  • 从 IE 将站点放入受信任的站点(而不是 Intranet 区域)并重新测试,没有成功。删除后再次进入 Intranet 区域。

  • 将 Intranet 区域的 IE 设置更改为“使用用户名和密码自动登录”,仍然无法访问。

  • 删除了协商选项,因此它只会强制 NTLM,仍然无法访问。

  • 使用而不是服务器名称从工作站进行测试http://<ipaddress>/Myapp。提示输入凭据(预期),但在输入正确详细信息时提示 3 次,然后无法访问。

  • 尝试将网络服务添加为 IIS_IUSRS 组的成员(没有什么特别的原因说明这可能有帮助),仍然无法访问。

  • 将默认应用程序池的标识从 NETWORK SERVICE 更改回 ApplicationPoolIdentity。导航到http://localhost服务器并收到服务器错误。事件日志中有以下消息:

错误:应用程序池 DefaultAppPool 已被禁用。Windows 进程激活服务 (WAS) 在启动工作进程来为应用程序池提供服务时遇到故障。

警告:应用程序池 DefaultAppPool 的标识无效。为该标识指定的用户名或密码可能不正确,或者用户可能没有批量登录权限。如果不更正该标识,则当应用程序池收到其第一个请求时,该应用程序池将被禁用。如果批量登录权限导致问题,则必须在授予权限后更改 IIS 配置存储中的标识,然后 Windows Process Activation Service (WAS) 才能重试登录。如果在处理应用程序池的第一个请求后该标识仍然无效,则该应用程序池将被禁用。数据字段包含错误号。

警告:应用程序池 DefaultAppPool 已被禁用。Windows 进程激活服务 (WAS) 未创建工作进程来为应用程序池提供服务,因为应用程序池标识无效。

  • 将身份重新设置为 NETWORK SERVICE 解决了上述问题。但我确实想知道这是否相关。

  • 我使用 F12 开发工具查看请求/响应标头:服务器正在发送,WWW-Authenticate: NegotiateWWW-Authenticate: NTLM在从工作站进行测试时。IE 没有在请求标头中发送任何与 WWW-Authenticate 相关的内容。当在服务器上从 IE 进行相同测试时(它确实可以正确进行身份验证),响应标头是WWW-Authenticate: Negotiate <then a long securitytoken like oRswGaADCg....>

  • 我将服务器上的 applicationHost.config 文件与本地文件进行了比较,没有发现任何明显的问题。例如,WindowsAuthenticationModule列出的是,所以它不像这个问题

我对这个很困惑...

对于我应该尝试或进一步排除故障的任何建议,我将不胜感激。

(也发布于IIS 论坛在这里

答案1

问题解决了。客户端在错误的 OU 中创建了计算机帐户:它位于计算机 OU 中,而不是服务器中。这可能意味着它获得了一些 GPO 设置,阻止了非管理员帐户的访问……或类似的东西。

我将尝试获取修复前后的 gpresult.exe 输出,以确定究竟是什么策略导致了这个问题。

对于任何解决类似问题的人我建议这篇博文。它没有为我解决问题,但却提供了各种用于调查 Kerberos 问题的有用信息。

答案2

我注意到了类似的问题将服务器从 .NET 4.5 升级到 .NET 4.6

在服务器上升级 .NET 之后,我 IIS 中所有正在运行的站点都停止工作,并出现有关未经授权访问的 401.2 错误……等等。

“怎么回事?20分钟前他们还在工作。”

在查看 IIS7 后,我注意到现在只启用了“匿名身份验证”,而不是正式禁用,“Windows 身份验证”不再启用。因此,由于我的网站仅支持 Windows 身份验证,因此存在问题。

故事寓意 = 仔细检查 IIS7 中的身份验证模式

值得思考的问题:II7 中的身份验证模式怎么全部重置为默认启用“匿名身份验证”?是因为升级到 .NET 4.6 吗?

相关内容