我有一个在 Windows 2003 服务器上的 IIS 7 下运行的 .NET 3.5 应用程序,当我继续收到登录提示时,无法使集成 Windows 身份验证正常工作。我已在 IIS 中将 Windows 身份验证设置为启用,并禁用了所有其他安全类型,并且我的应用程序 web.config 文件身份验证/授权设置为:
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="3.5" />
<authenticationmode="Windows"/>
<authorization>
<deny users = "?" />
</authorization>
</system.web>
使用此设置,我期望 Windows 用户的幕后验证允许访问和拒绝匿名用户。但是,当我尝试访问该站点时,我得到的是一个 Windows 登录弹出窗口。
这几天我一直在解决这个问题,但无法找出问题所在。根据有类似问题的帖子,我确认我的 URL 不包含任何句点,仔细检查我的 IE 设置是否设置为启用集成 Windows 身份验证,并将我的 URL 添加到我的 Intranet 站点,但仍然弹出。
为了进一步排除故障,我在 IIS 中启用了匿名身份验证并修改了我的 web.config 文件,让我可以直接进入,然后添加 Response.Write(System.Security.Principal.WindowsIdentifity.getcurrent().user.name.toString() ) 来尝试查看身份验证中使用的用户。我得到的结果是 IIS APPPOOL\myapp 这显然是我的应用程序的 IIS 应用程序池。
我非常感谢任何人可以提供的任何帮助,这样我仍然只使用 Windows 身份验证,但没有弹出窗口,并且 Windows 身份验证是针对实际 Windows 用户执行的。
谢谢。
进一步排除故障后的附加说明:
刚刚注意到,当登录失败并且再次显示 Windows 登录提示时,它显示尝试登录为“SERVERNAME”\“USERNAME”的用户名,这让我相信它正在尝试针对服务器验证用户而不是领域。为了确认这一点,我直接在应用服务器上创建了一个本地用户帐户,其用户名和密码与网络域用户相同,并尝试再次登录。结果是我再次收到登录提示,但这次输入用户名和密码时,我能够成功登录。网络用户和应用服务器在同一个域上,所以真的不知道为什么 IIS 身份验证指向本地应用服务器帐户而不是域帐户。我意识到此时这是一个 IIS 问题,因此也发布在 forums.iis.net 上,但感谢任何人可能有的任何建议,因为这几天以来一直在解决这个问题。
<authentication mode="Windows" />
希望这只是您的问题中的一个错字?
我有一个正在使用的 Windows 2008 服务器,所以我的答案与 OP 在 Windows 2003 服务器上的答案并不完全相同。
这是我所做的(在这里记录下来,以便以后找到)。
我遇到了同样的问题:
https://i.stack.imgur.com/zxtO0.jpg
在我的 Web.config 文件中,我有这个部分:
<system.web>
<authentication mode="Windows" />
<authorization>
<allow users="*" />
<deny users="?" />
</authorization>
</system.web>
在 IIS 下,所有这些似乎都在 Authentication 图标下得到解决。
编辑权限:确保您的 ASP.NET 帐户具有权限。我的最初没有添加。
https://i.stack.imgur.com/sLmIJ.jpg
现在进入身份验证的功能:
https://i.stack.imgur.com/6iNSr.jpg
使用 IUSR
启用 匿名身份验证:
https://i.stack.imgur.com/Z2O1c.jpg
启用 Windows 身份验证,然后右键单击以设置提供程序。
NTLM 必须是第一!
https://i.stack.imgur.com/m5eDV.jpg
接下来,检查 Advanced Settings... 下的 Extended Protection 是否为 Accept 并且 Enable Kernel-mode authentication 是否为 CHECKED:
https://i.stack.imgur.com/J9kqz.jpg
完成此操作后,我返回到我的 Web 应用程序,单击“浏览”链接并登录,而无需再次提供我的凭据。
我希望这对你们中的许多人有益,我希望它以后对我也有用。
只是为了他人的利益。如果错误是 401.1 Unauthorized
并且您的错误代码与 0xc000006d
匹配,那么您实际上遇到了一个安全“功能”,该功能会阻止对 FQDN 或与您的本地计算机名称不匹配的自定义主机标头的请求:
请按照此支持文章解决此问题:
https://webconnection.west-wind.com/docs/_4gi0ql5jb.htm(原始,现已失效:http://support.microsoft.com/kb/896861)
从支持文章中,以确保它不会丢失:
解决方法是显式禁用此策略的注册表黑客。要手动执行此配置,请在服务器上的注册表中找到此键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 并编辑或添加新键:DisableLoopbackCheck (DWORD) 然后将值发送到 1 以禁用环回检查(本地身份验证有效),或为 0(不允许本地身份验证)。或者更容易使用 Powershell:New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name "DisableLoopbackCheck" -Value "1" -PropertyType dword 看起来 Windows 10(1803 及更高版本?)的最新版本也需要此配置设置以便在本地进行身份验证。
这花了我一段时间,因为这里其他所有人的评论都没有帮助我。我找到了这篇文章并修复了它!
我有一个类似的问题,我只想保护我网站的某个部分。除了在 IE 中,一切都运行良好。我同时启用了匿名和 Windows 身份验证。对于匿名,身份设置为应用程序池身份。问题出在 Windows 身份验证上。经过一番挖掘后,我启动了 fiddler,发现它使用 Kerberos 作为提供程序(实际上它默认设置为协商)。我将它切换到 NTLM 并修复了它。高温高压
道迪
为您的网络安全添加权限 [域用户]。
在站点文件夹下的 IIS 中右键单击您的站点
单击编辑权限...
选择安全选项卡
在组或用户名部分下单击编辑...按钮
在权限弹出窗口中,在组或用户名下单击添加...
在对象名称中输入 [域用户] 以选择文本区域,然后单击确定以应用更改
单击确定关闭权限弹出窗口
单击“确定”关闭“属性”弹出窗口并应用您的新设置
不要通过更改所有内容在您的服务器上创建错误。如果在 2008 R2 上使用 Windows 身份验证时出现 Windows 提示登录,只需转到 Providers
并为每个应用程序向上移动 NTLM
。当 Negotiate
是列表中的第一个时,Windows 身份验证可以停止 2008 R2 上特定应用程序的工作属性,并且系统会提示您输入用户名和密码,而不是永远工作。当您更新应用程序时,有时会发生这种情况。只需确保 NTLM
位于列表的首位,您将永远不会再看到此问题。
如果您的 URL 在域名中有点,IE 会将其视为 Internet 地址,而不是本地地址。你至少有两个选择:
获取要在 URL 中使用的别名来替换 server.domain。例如,我的应用程序。在您的计算机上按照以下步骤操作。
转到该站点并取消登录对话框。让这种情况发生:
https://i.stack.imgur.com/CzvPq.png
在 IE 的设置中:
https://i.stack.imgur.com/PUs5X.png
https://i.stack.imgur.com/sN2df.png
https://i.stack.imgur.com/Yq4Vu.png
这为我修好了。
我的服务器和客户端电脑是 Windows 7 并且在同一个域中
在iis7.5中-为您的Intranet启用Windows身份验证(禁用所有其他身份验证..也无需在web.config文件中提及Windows身份验证然后转到客户端PC .. IE8或9-工具-互联网选项-安全-本地Intranet-Sites-advanced-Add your site(去掉"require server verfi..."ticketmark..不需要IE8或9-工具-internet选项-安全-本地Intranet-自定义级别-userauthentication-logon-选择自动登录使用当前用户名和密码保存此设置..您已完成..不再提示输入用户名和密码。请确保,因为您的客户端 PC 是域的一部分,您必须有一个 GPO 用于此设置,.. orelse 此设置下次用户登录 Windows 时将恢复
WindowsIdentity.GetCurrent
是正确的:您应该获取 APPPOOL 用户。这是因为执行代码的 ASP.NET 进程是当前身份。如果您希望它返回访问站点身份的用户,您需要在 web.config 中添加以下行:
<identity impersonate="true" />
这会导致进程假定请求页面的用户的身份。所有操作都将代表他们执行,因此任何读取网络上的文件夹或访问数据库资源等的尝试都意味着当前用户将需要对这些内容的权限。您可以阅读有关模拟的更多信息here。请注意,根据您的 Web/数据库服务器拓扑的设置方式,您可能会在启用模拟时遇到委派问题。
但是您最初的问题是,似乎无法确定身份,并且您正在获得登录弹出窗口。我会注意到,如果您在 IIS 中禁用了匿名身份验证,则不需要 <deny>
块。我们从不包含它(除了特殊的 <location>
块等),所以我想说您可以尝试删除它并重试。不过,其他一切听起来都不错。
您没有指定在 IIS 中运行应用程序池的用户。它是自定义帐户还是默认帐户?如果是自定义的,它是域帐户还是 Web 服务器上的本地帐户?自定义帐户有时可能需要更多步骤,例如注册 SPN。此外,自定义帐户在 AD 中没有解析传入用户帐户的权限可能是一个问题。
您还可以检查 IIS 日志以查看返回的响应。它很可能是 401,但它后面应该有一个子编号,例如 401.2 或其他东西。该子编号有时可以帮助确定根本问题。此 KB article 列出了五个。
可以是浏览器相关的。如果您使用的是 IE,您可以转到高级设置并选中“启用 Windows 集成身份验证”复选框。
在我的情况下,授权设置没有正确设置。
我不得不
在 IIS 管理器中打开 .NET 授权规则并删除拒绝规则
在我们的 Intranet 中,通过调整安全设置在客户端解决了该问题,如下所示。右边的任何一个复选框都对我们有用。
https://i.stack.imgur.com/TpVPR.png
我刚刚用 ASP.Net 应用程序解决了一个类似的问题。
症状:我可以使用本地用户而不是域用户登录我的应用程序,即使机器已正确加入域(如您在附加说明中所说)。在安全事件查看器中,有一个 ID=4625“域 sid 不一致”的事件。
解决方案:我找到了解决方案 here。问题是我的测试机器克隆了虚拟机(Windows Server 2008 R2;一个域控制器和一个 Web 服务器)。两者都有相同的机器 SID,这显然会导致问题。这是我所做的:
从域中删除 Web 服务器。在 VM 中运行 c:\Windows\System32\Sysprep\Sysprep.exe。重新启动虚拟机。将 Web 服务器加入域。
您在此过程中丢失了一些设置(用户首选项、静态 IP、重新创建自签名证书),但现在我已经重新创建了它们,一切正常。
我也有同样的问题。尝试了在这个论坛和其他论坛上找到的大部分内容。
自己做了一点RnD后终于成功了。
我进入 IIS 设置,然后在我的网站权限选项中添加了我的组织域用户组。
现在,由于我的所有域用户都被授予访问该网站的权限,因此我没有遇到该问题。
希望这可以帮助
我尝试了上面的 IIS 配置技巧和回送注册表黑客,我查看并重新创建了应用程序池权限和其他十几个东西,但仍然无法摆脱在我的开发工作站上使用 IIS Express 或 IIS 7.5 运行的身份验证循环,从本地或远程浏览会话。我收到了四个 401.2 状态响应和一个空白页。部署到我的 IIS 8.5 登台服务器的完全相同的站点可以完美运行。
最后,我注意到浏览器显示为空白的响应正文中的标记包含成功登录的默认页面。我确定针对 401 错误的 ASP.NET 和 HTTP 的自定义错误处理正在阻止/干扰我的工作站的 Windows 身份验证但不是登台服务器。我花了几个小时来解决这个问题,但只要我删除了针对 401 错误的自定义处理,工作站就恢复了正常。我提出这是另一种射击自己的脚的方法。
您是否尝试过使用您的域前缀登录,例如 DOMAIN\Username? IIS 6 默认使用主机作为默认域,因此在登录时指定域可能会解决问题。
我在 .net core 2 上遇到了这个问题,在查看了这里的大多数建议之后,似乎我们错过了 web.config 上的设置
<aspNetCore processPath="dotnet" arguments=".\app.dll" forwardWindowsAuthToken="false" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
正确的设置是 forwardWindowsAuthToken="true" 现在看起来很明显但是当有这么多相同问题的情况时,很难查明
编辑:我还发现以下解决问题的 Msdn article 很有帮助。
https://i.stack.imgur.com/jnFyc.png
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa solved my problem.
创建可以在 NTLM 身份验证请求中引用的本地安全机构主机名。
为此,请对客户端计算机上的所有节点执行以下步骤:
单击开始,单击运行,键入 regedit,然后单击确定。找到并单击以下注册表子项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0 右键单击 MSV1_0,指向新建,然后单击多字符串值。在名称列中,键入 BackConnectionHostNames,然后按 Enter。右键单击 BackConnectionHostNames,然后单击修改。在数值数据框中,键入用于计算机上本地共享的 CNAME 或 DNS 别名,然后单击确定。
笔记
在单独的行中键入每个主机名。如果
BackConnectionHostNames 注册表项以 REG_DWORD 类型存在,您必须删除 BackConnectionHostNames 注册表项。退出注册表编辑器,然后重新启动计算机。
值得一提的是,在 Windows Server 2019 上进行更改后,我不需要重新启动。
当应用程序池标识为 ApplicationPoolIdentity 时,IIS7.0 或 IIS7.5 中的 Windows 身份验证不适用于 kerberos (provider=Negotiate) 必须使用网络服务或其他内置帐户。另一种可能性是使用 NTLM 让 Windows Authenticatio 工作(在 Windows 身份验证、提供程序中,将 NTLM 放在顶部或删除协商)
克里斯·范德维耶弗
我遇到了同样的问题,因为我在应用程序池中使用的用户(身份)没有低于 IIS_IUSRS 组。将用户添加到组中,一切正常
在我的情况下,解决方案是(在上面建议的调整之上)重新启动我/用户的本地开发计算机/IIS(托管服务器)。我的用户刚刚被添加到新创建的 AD 安全组中 - 在我注销/重新启动计算机之前,策略不适用于用户 AD 帐户。
希望这会对某人有所帮助。
我遇到了同样的凭据提示问题,并进行了快速搜索,互联网上没有任何东西可以解决它。花了一些时间才发现问题,一个愚蠢的问题。
在 IIS -> 高级设置 -> 物理路径凭据中(为空)
一旦我添加了可以访问 VM/服务器的机器 ID(域/用户),密码提示就会停止。
希望这可以帮助
https://i.stack.imgur.com/eln2A.jpg