使用集成的Windows身份验证接收登录提示


108

我有一个Windows 2003 Server的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上发布。


4
身份验证和模式之间应该有一个空格,例如:<authentication mode="Windows" />希望那只是您输入问题的错字?
肖恩·汉利

3
您在服务器2003上运行iis 7,您确定我几乎肯定这是不可能的。
Anicho 2012年

Answers:


86

我有一个正在使用的Windows 2008服务器,因此我的答案与Windows 2003服务器上的OP并不完全相同。

这就是我所做的事情(在此处记录下来,以便以后找到)。

我遇到了同样的问题:

登录提示

在我的Web.config文件中,有以下部分:

<system.web>
    <authentication mode="Windows" />
    <authorization>
        <allow users="*" />
        <deny users="?" />
    </authorization>
</system.web>

在IIS下,所有这些似乎都可以在“ 身份验证”图标下解决。

  1. 编辑权限:确保您的ASP.NET帐户具有权限。我的不是最初添加的。

ASP.NET权限

现在进入身份验证功能:

认证功能

启用匿名身份验证IUSR

匿名认证

启用Windows身份验证,然后单击鼠标右键以设置提供程序

NTLM首先需要!

Windows验证

接下来,检查在高级设置...扩展保护接受启用内核模式身份验证进行检查:

高级设置

完成此操作后,我返回到Web应用程序,单击“浏览”链接,然后登录,而无需再次提供我的凭据。

我希望这对你们中的许多人都有益,也希望以后对我也有用。


1
谢谢Sujay。我注意到SO上的大多数这些技巧都缺乏图片来显示他们在说什么,所以我想展示我使用的所有步骤。如果这样做为别人工作,至少他们可以看到他们所采取的步骤,以及什么其他选择尝试。
jp2code 2015年

1
正因为如此,我一直在发疯。图片使它变得更加容易。谢谢!!
KratosMafia '16

1
它对我也确实起作用,但是最后我不得不重新启动Windows 2008 r2实例。我认为提到它可能很重要。
Aleksei Mialkin '16

6
不适用于运行IIS 8.5的Windows Server 2012
Minh Nguyen

3
这不是仅启用匿名身份验证,从而允许Windows身份验证被忽略吗?真正的问题,但是,这对我来说却是如何。
Paul Hodgson

49

只是为了别人的利益。如果错误是a 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和更高版本?)也需要此配置设置才能在本地进行身份验证。

这个人花了我一段时间,因为这里其他所有人的评论都没有帮助我。我找到了这篇文章,并对其进行了修复!


3
您的先生是我的f * g英雄!我已经经历了很多“解决方案”才能做到这一点。谢谢!
2014年

1
天啊!两天的时间尝试使此事情生效,最后您给了我答案!谢谢!
BernieSF,2015年

1
在仔细研究了多个答案之后,发现配置与我的配置相同,这就是答案!
Sietse

1
你传奇!这对我有用。我花了很长时间找到这个。
安迪·芬内尔斯

2
@PTD更新了新文章,并增加了后代摘要,以免丢失。如此多的MS支持永久链接!
kamranicus

26

我有一个类似的问题,我只想保护网站的某些部分。除了在IE中,其他所有功能都运行良好。我同时启用了匿名和Windows身份验证。对于匿名,身份设置为应用程序池身份。问题出在Windows身份验证上。经过一番挖掘后,我启动了提琴手,发现它正在使用Kerberos作为提供程序(实际上默认情况下将其设置为Negotiate)。我将其切换为NTLM,并进行了修复。高温超导

达迪


1
为我完成了,谢谢!我可以在本地访问时选择Windows用户,但是凭据请求将从域中的任何其他计算机弹出。
JSancho

1
@Daudi您如何设置每种身份验证方法的身份?
罗伯·贝尔

18

向您的网络安全添加权限[域用户]。

  • 右键单击“站点”文件夹下的IIS中的站点
  • 单击编辑权限...
  • 选择安全选项卡
  • 在“组或用户名”部分下,单击“编辑...”按钮
  • 在“权限”弹出窗口中的“组或用户名”下,单击“添加...”。
  • 在对象名称中输入[Domain Users]以选择文本区域,然后单击“确定”以应用更改
  • 单击“确定”关闭“权限”弹出窗口
  • 单击“确定”关闭“属性”弹出窗口并应用新设置

10
有关如何执行此操作的步骤将很有帮助。
德鲁·查平

2
+1。你救了我的日子和我的理智。非常感激!
stakx-在14:10不再贡献

11

不要通过更改所有内容在服务器上造成错误。如果在2008 R2上使用Windows身份验证时出现Windows登录提示,则只需为每个应用程序转到Providers并上移NTLM。如果Negotiate是列表中的第一个,Windows身份验证可能会停止在2008 R2上运行特定应用程序的属性,并且提示您输入用户名和密码,这将永远不会起作用。有时在您更新应用程序时发生。只需确保比NTLM列表中的第一个优先,您将再也不会遇到此问题。


1
这为我解决了。
大浪

9
除非您当然不希望NTLM首先出现在列表中...否则将导致后果,任何进行此类更改的人都应了解NTLM和Negotiate之间的区别(在最基本的水平上,Negotiate首先尝试进行Kerberos身份验证并失败。返回NTLM(如果失败)。如果您想要Kerberos(很多人想要),那么这不是一个好的解决方案。一些细节在这里:msdn.microsoft.com/en-us/library/aa480475.aspx
TCC

8

如果您的URL域名中包含点,则IE会将其视为互联网地址而不是本地地址。您至少有两个选择:

  1. 获取别名以在URL中使用以替换server.domain。例如,myapp。
  2. 请在计算机上执行以下步骤。

转到站点并取消登录对话框。让这种情况发生:

在此处输入图片说明

在IE的设置中:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


1
我们正在使用Windows Server 2012,这是唯一适用于我们的解决方案。非常感谢!
ashilon'1

5

WindowsIdentity.GetCurrent是正确的:您应该获得APPPOOL用户。这是因为执行您的代码的ASP.NET进程是当前标识。如果希望它返回击中网站身份的用户,则需要在web.config中添加以下行:

<identity impersonate="true" />

这使过程假定请求页面的用户的身份。所有操作将代表它们执行,因此任何尝试读取网络上的文件夹或访问数据库资源之类的尝试都将意味着当前用户将需要这些内容的权限。您可以阅读有关假冒的更多信息在此处信息。请注意,根据Web /数据库服务器拓扑的设置方式,启用模拟时可能会遇到委派问题。

但是您的原始问题是,似乎无法确定身份,并且出现了登录弹出窗口。我会注意到,<deny>如果您在IIS中禁用了匿名身份验证,则不需要阻止。我们从不包含它(除非特殊<location>块中,),因此我想您可以尝试将其删除并重试。不过,其他一切听起来都不错。

您没有指定哪个用户正在IIS中运行应用程序池。它是自定义帐户还是默认帐户?如果是自定义的,它是Web服务器上的域帐户还是本地帐户?自定义帐户有时可能需要更多步骤,例如注册SPN。同样,自定义帐户可能在AD中没有解决传入用户帐户的权限的问题。

您可能还会检查IIS日志以查看返回了什么响应。它很可能是401,但它后面应有一个子编号,如401.2之类。该子编号有时可以帮助确定根本问题。该知识库文章列出了五个。


+1表示SPN的要求。实际上,我在登录弹出窗口中遇到的大多数问题是由于Kerberos环境中缺少SPN而引起的。
SBS

5

这为我解决了。

我的服务器和客户端PC是Windows 7,位于同一域中

  1. 在iis7.5中,启用Intranet的Windows身份验证(禁用所有其他身份验证。也无需在web.config文件中提及Windows身份验证

  2. 然后转到客户端PC .. IE8或9-工具-互联网选项-安全-本地Intranet-站点-高级-添加您的站点(取消“需要服务器验证...”票证。

  3. IE8或9-工具-Internet选项-安全性-本地Intranet-自定义级别-用户身份验证-登录-选择使用当前用户名和密码的自动登录

  4. 保存此设置。完成。.不再提示输入用户名和密码。

  5. 确保,因为您的客户端PC是域的一部分,所以您必须具有此设置的GPO,否则该设置将在用户下次登录Windows时还原。


2
对于1)我实际上启用了模拟和Windows身份验证,一切都很好。对我来说,关键是2)将远程站点地址添加到本地Intranet区域。
SideFX

4

可以与浏览器相关。如果使用的是IE,则可以转到“高级设置”,然后选中“启用Windows集成身份验证”复选框。


4

就我而言,授权设置未正确设置。

我不得不

  1. 在IIS管理器中打开.NET授权规则

    在IIS管理器中打开.NET授权规则
  2. 删除拒绝规则”

    删除拒绝规则

3

在我们的Intranet中,通过调整安全性设置(如此处所示),在客户端解决了该问题。右边的任何一个复选框都对我们有用。

IE Internet选项


2

我刚刚用ASP.Net应用程序解决了类似的问题。

症状: 即使计算机已正确加入域,也可以使用本地用户而非域用户登录我的应用程序(如您在附加说明中所述)。在安全事件查看器中,有一个ID = 4625“域sid不一致”的事件。

解决方案: 我在这里找到了解决方案。问题是我的测试计算机上克隆了虚拟机(Windows Server 2008 R2;一台域控制器和一台Web服务器)。两者都具有相同的计算机SID,这显然会引起问题。这是我所做的:

  1. 从域中删除Web服务器。
  2. 在虚拟机中运行c:\ Windows \ System32 \ Sysprep \ Sysprep.exe。
  3. 重新启动VM。
  4. 将Web服务器加入域。

您在此过程中失去了一些设置(用户首选项,静态IP,重新创建自签名证书),但是现在我已经重新创建它们,一切都可以正常工作。


当您尝试设置约束委派时,克隆很糟糕。
SideFX

2

我也有同样的问题。尝试了本论坛和其他论坛上的大多数内容。

自己做了一点RnD,终于成功了。

我进入IIS设置,然后进入我的网站权限选项,添加了我的组织域用户组。

现在,由于我所有的域用户都被授予了对该网站的访问权限,因此我没有遇到该问题。

希望这可以帮助


4
您在说什么权限选项?您能否提供有关您所做工作的更多详细步骤?
Drew Chapin 2013年

1

您是否尝试过使用域前缀(例如DOMAIN \ Username)登录?IIS 6默认使用主机作为默认域,因此在登录时指定域可以解决此问题。


1

我尝试了上述IIS配置技巧和回送注册表黑客攻击,并查看并重新创建了应用程序池权限以及许多其他功能,但仍然无法摆脱在使用IIS Express或IIS 7.5的开发工作站上运行的身份验证循环,从本地或远程浏览会话中。我收到了四个401.2状态响应和一个空白页。完全相同的站点部署到我的IIS 8.5过渡服务器上可以正常工作。

最终,我注意到响应主体中的标记被浏览器显示为空白,其中包含用于成功登录的默认页面。我确定针对ASP.NET和401错误的HTTP的自定义错误处理正在阻止/干扰Windows身份验证我的工作站但不是登台服务器。我花了几个小时来摆弄这个问题,但是当我删除仅针对401错误的自定义处理后,工作站又恢复了正常。我提出这是另一种射击自己的脚的方法。


0

当应用程序池标识为ApplicationPoolIdentity时,IIS7.0或IIS7.5中的Windows身份验证不适用于kerberos(提供者=协商),则必须使用网络服务或另一个内置帐户。另一种可能性是使用NTLM来使Windows身份验证正常工作(在Windows身份验证中,提供程序将NTLM放在顶部或删除协商)

克里斯·范德维尔


3
不正确 重新启动服务器。注意它现在可以工作了。应用修补程序KB2545850。
阿米特·奈杜

哇。重新启动只是为我修复了它。现在需要检查多长时间。有任何想法吗?尚未调查Hotfix。
mplwork

我们有完全一样的情况-协商直到重新启动才与ApplicationPoolIdentity一起使用。
SergeyT 2015年

0

我有同样的问题,因为我在应用程序池中使用的用户(身份)没有低于IIS_IUSRS组。将用户添加到组中,一切正常


0

就我而言,解决方案是(在上面建议的调整之上)重新启动我/用户的本地开发计算机/ IIS(托管服务器)。我的用户刚刚被添加到新创建的AD安全组中,并且该策略直到我注销/重新启动计算机后才适用于用户AD帐户。

希望这会帮助某人。


0

我遇到了相同的凭据提示问题,并进行了快速搜索,但互联网上没有任何解决方法。找到这个问题花了一些时间,这是一个愚蠢的问题。

在IIS中->“高级设置”->“物理路径凭据”(为空)

一旦我添加了可以访问VM /服务器的计算机ID(域/用户),密码提示就会停止。

希望这可以帮助


0

我在.net core 2上遇到了这个问题,经过这里的大多数建议之后,似乎我们错过了web.config上的设置

<aspNetCore processPath="dotnet" arguments=".\app.dll" forwardWindowsAuthToken="false" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />

正确的设置是 forwardWindowsAuthToken =“ true”现在似乎很明显,但是当有很多情况都存在相同的问题时,很难查明

编辑:我也发现下面的Msdn文章对问题进行故障排除很有帮助。


-1

我遇到了同样的问题,通过将运行Web应用程序的应用程序池的应用程序池标识更改为NetworkService可以解决此问题 在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.