我正在IIS 7.5服务器(Win Server 2008 R2)上安装Web应用程序,并且遇到了Windows身份validation问题。 我已经做了这个安装几十次,但这个有我卡住,所以任何build议非常欢迎。
概要
只有pipe理员可以通过Windows身份validation连接到我的网站,但我希望所有用户都能通过身份validation。 pipe理员可以通过本地主机和另一台工作站从机器连接两者。 其他用户将被提示input凭据,而不是自动进行身份validation,并被拒绝访问。 这是尽pipe给每个人完全控制的网页目录。
详细情况 :
使用作为NETWORK SERVICE运行的应用程序池创buildWeb应用程序。 已启用Windows身份validation,所有其他人禁用 Windows身份validation具有内核模式= true(即默认的IIS),并提供者是命令NTLM,协商(尽pipe我也尝试了另一种方式)。 所有login都在同一个域上,而Web服务器在该域上。
应用程序安装在C:\MyApplication\App\
当login到服务器(作为pipe理员帐户),我可以导航到http://localhost/MyApp
并自动进行身份validation。
login到服务器(作为pipe理员帐户)时,我导航到http://webserver.full.domain.com/MyApp
并提示input凭据。 input3次后,我得到401.1未经授权的页面。
以常规用户帐户login到工作站时,导航到http://webserver/MyApp
提示input凭据3次,然后显示“拒绝访问”消息。
当以服务器上的pipe理员帐户login到工作站时,我也可以导航到http://webserver/MyApp
并自动进行身份validation。 使用其他帐户login不起作用。 这似乎对我来说特别怪异,这表明它只是关于权限…但权限似乎很好?!
即使在本文中启用了详细的Kerberos日志logging,也没有logging到安全事件日志的故障。
SPN似乎设置正确,因为我从另一台机器上使用了“setspn -L servername”,并看到两个条目HOST/servername
和HOST/servername.full.domain.com
。
服务器上还有另一个应用程序,作为NETWORK SERVICE运行,在IIS中使用匿名身份validation,然后使用SQL集成安全性连接到SQL Server。 它不使用模拟,因此连接到SQL Server作为机器身份DOMAIN\SERVER$
。 这工作正常。 我提到这一点,因为它表明该机器在域上没有根本问题,因为它的身份被SQL Server接受。
我已将NETWORK SERVICE完全控制权授予应用程序所在的Web服务器文件夹( C:\MyApplication\
)。 我已经给了authentication的用户读/列表/执行权限。 来自工作站的Internet Explorer正确识别在Intranet区域中的http://webserver/MyApp
Internet Explorer启用了Windows身份validation。
我也尝试创build另一个虚拟目录到C:\MyApplication\test
,其中包含test.html中的单个文件,同时也启用了Windows身份validation,并且还具有适当的权限。 同样的症状,但我得到401.2未经授权,而不是401.1。
服务器最初没有安装IISangular色,所以我添加了这个。 我忘记了第一次select“Windows身份validation”,所以当我尝试为我的应用程序打开Windows身份validation时添加了此angular色服务。
当我最初安装IISangular色并导航到http://localhost
,默认应用程序池停止,并显示服务器失败消息。 切换默认应用程序池作为networking服务运行解决了这个问题。 我现在想知道这是否意味着服务器上可能会导致我的身份validation问题的其他问题。 例如此修补程序 ,虽然运行NETWORK SERVICE时不应该影响我。
以防万一,重新启动服务器并重新testing。 没有运气。
创build一个testing文件c:\inetpub\wwwroot\testwwwroot\test.html
,仅在网站上设置Windows身份validation,并尝试从工作站访问它。 同样的症状。 因此,这是一个适用于wwwroot以及其他文件夹的问题。
给每个人完全控制文件夹和重新testing,仍然没有访问权限。
给最终用户完全控制文件夹和重新testing,仍然没有访问权限。
从IE把该网站放入可信站点(而不是Intranet区域),并重新testing,没有运气。 删除所以它再次Intranet区域。
将Intranet区域的IE设置更改为“使用用户名和密码自动login”,仍然无法访问。
作为一个选项删除了谈判,所以它只会强制NTLM,仍然没有访问权限。
使用http://<ipaddress>/Myapp
从工作站进行testing,而不是服务器名称。 提示input凭据(预期),但在input正确的详细信息时提示3次,然后无法访问。
尝试添加networking服务作为IIS_IUSRS组的成员(没有特别的理由为什么这可能有帮助),仍然没有访问。
将默认应用程序池的身份从NETWORK SERVICE更改为ApplicationPoolIdentity。 从服务器导航到http://localhost
并得到服务器错误。 在事件日志中有以下消息:
错误:应用程序池DefaultAppPool已被禁用。 Windows进程激活服务(WAS)在启动工作进程为应用程序池提供服务时遇到了故障。
警告:应用程序池DefaultAppPool的标识无效。 为身份指定的用户名或密码可能不正确,或者用户可能没有批处理login权限。 如果身份未被更正,应用程序池将在应用程序池收到第一个请求时被禁用。 如果批处理login权限导致该问题,则Windows进程激活服务(WAS)可以重试login之前,必须在授予权限后更改IISconfiguration存储中的标识。 如果在处理应用程序池的第一个请求之后身份保持无效,应用程序池将被禁用。 数据字段包含错误编号。
警告:应用程序池DefaultAppPool已被禁用。 Windows进程激活服务(WAS)没有创build工作进程来为应用程序池提供服务,因为应用程序池标识无效。
将身份设置回networking服务解决了上述问题。 但是我想知道这是否相关。
我使用F12开发工具来查看请求/响应标头:当从工作站进行testing时,服务器正在发送WWW-Authenticate: Negotiate
和WWW-Authenticate: NTLM
。 IE没有发送任何与请求头相关的WWW-Authenticate。 当从服务器上的IE进行相同的testing(它在那里进行正确的身份validation),响应头是WWW-Authenticate: Negotiate <then a long securitytoken like oRswGaADCg....>
我比较了服务器的applicationHost.config文件和我的本地文件,没有看到任何明显的问题。 例如WindowsAuthenticationModule
列出,所以它不是这个问题 。
我很坚持这个…
任何build议,我应该尝试或看看排除故障进一步非常感谢。
( 这里也发布在IIS论坛上 )
问题解决了。 客户端在错误的OU中创build了“计算机”帐户:它在“计算机OU”中而不是“服务器”中。 也许这意味着它有一些GPO设置,阻止访问非pipe理员帐户…或沿着这些线路的东西。
我将尝试在修复之前和之后获得gpresult.exe输出,以确定究竟是由什么原因引起的。
对于任何疑难解答类似的问题,我推荐这篇博文 。 它并没有为我解决这个问题,而是提到了查看Kerberos问题的各种有用的东西。
将服务器从.NET 4.5升级到.NET 4.6后,我发现了类似的问题。
在服务器上升级.NET后,我所有在IIS中的网站正在工作,现在停止与这个关于未经授权的访问401.2错误…等等等等。
“什么给了 – 他们在20分钟前工作。”
在IIS7中查看后,我注意到现在只有“匿名身份validation”启用,而不是正式被禁用,“Windows身份validation” 不再被启用 。 因此,我的网站只支持Windows身份validation的问题。
道德故事=双重检查IIS7中的身份validation模式
思考问题 :II7中的身份validation模式是如何全部重置为启用默认“匿名身份validation”的? 是否由于.NET 4.6的升级?