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

Cas*_*sey 104 asp.net iis-7 windows-authentication

我有一个在Windows 2003服务器上的IIS 7下运行的.NET 3.5应用程序,并且在我继续提示登录时无法使集成的Windows身份验证正常工作.我已将IIS身份验证设置为在IIS中启用,并禁用所有其他安全类型,并且我的应用程序web.config文件身份验证/授权设置为:

<system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="3.5" />
    <authenticationmode="Windows"/>
    <authorization>
    <deny users = "?" />
    </authorization>
</system.web>
Run Code Online (Sandbox Code Playgroud)

通过这种设置,我期待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上,但感谢任何人可能有任何建议,因为已经解决了这几天.

jp2*_*ode 85

我有一个我正在研究的Windows 2008服务器,所以我的答案与OP在Windows 2003服务器上的答案并不完全相同.

这就是我所做的(在这里记录下来,以后我可以找到它).

我遇到了同样的问题:

登录提示

在我的Web.config文件中,我有这个部分:

<system.web>
    <authentication mode="Windows" />
    <authorization>
        <allow users="*" />
        <deny users="?" />
    </authorization>
</system.web>
Run Code Online (Sandbox Code Playgroud)

在IIS下,所有这些似乎都在Authentication图标下解决.

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

ASP.NET权限

现在进入身份验证的功能:

验证功能

启用匿名身份验证IUSR:

匿名身份验证

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

NTLM需要第一!

Windows身份验证

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

高级设置

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

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

  • 不适用于运行IIS 8.5的Windows Server 2012 (6认同)
  • 这太神奇了,我因此而发疯。这些照片让事情变得容易多了。谢谢!! (2认同)
  • 这不是只启用匿名身份验证,从而允许Windows身份验证被忽略吗?真正的问题,但是以上内容对我而言却是这样。 (2认同)

kam*_*cus 43

只是为了其他人的利益.如果错误是a 401.1 Unauthorized并且您的错误代码匹配0xc000006d,那么您实际上遇到了一个安全"功能",它阻止了对FQDN的请求或与您的本地计算机名称不匹配的自定义主机头:

请按照此支持文章来解决此问题:

http://support.microsoft.com/kb/896861

这个花了我一段时间,因为其他人的评论都没有帮助我.我发现这篇文章并修复了它!

  • @PTD 更新了新文章并为后代添加了摘要,这样它就不会丢失。MS 支持永久链接就这么多! (3认同)
  • 你先生是我的英雄!我已经通过这么多"解决方案"来实现这个目标.谢谢! (2认同)
  • 天啊!两天努力把这个东西付诸实践,最后你给了我答案!谢谢! (2认同)
  • 在研究了多个答案并看到配置与我的相同之后,这就是答案! (2认同)
  • 你传奇!这对我有用。我花了很长时间才找到这个。 (2认同)

小智 26

我有一个类似的问题,我想只保护我网站的某个部分.除IE之外,一切都运作良好.我启用了匿名和Windows身份验证.对于Anonymous,Identity设置为Application Pool标识.问题出在Windows身份验证上.经过一番挖掘后,我解雇了小提琴手并发现它使用的是Kerberos作为提供者(实际上它默认设置为Negotiate).我把它切换到NTLM并修复了它.HTH

达乌迪


小智 17

将[域用户]权限添加到您的Web安全性.

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

  • 如何做到这一点的步骤将是有帮助的. (10认同)
  • +1.你救了我的一天和我的理智.非常感激! (2认同)

Slo*_*Slo 12

不要通过更改所有内容在服务器上创建错误.如果在2008 R2上使用Windows身份验证时有Windows提示登录,只需转到每个应用程序Providers并向上移动NTLM.如果Negotiate是列表中的第一个,Windows身份验证可以停止为2008 R2上的特定应用程序的属性工作,并且系统会提示您输入用户名和密码,而不是从不工作.当您更新应用程序时,有时会发生这种情况.请确保不是NTLM列表中的第一个,你再也不会看到这个问题了.

  • 除非您当然不希望NTLM首先出现在您的列表中......采取此行动会产生后果,任何进行此类更改的人都应该了解NTLM和Negotiate之间的区别(在最基本的级别上协商首次尝试Kerberos身份验证和崩溃如果失败,则回到NTLM).如果你想要Kerberos(还有很多人),那么这不是一个好的解决方案.这里有一些细节:http://msdn.microsoft.com/en-us/library/aa480475.aspx (9认同)

Bob*_*orn 7

如果您的URL在域名中有点,IE会将其视为互联网地址而非本地.您至少有两个选择:

  1. 获取在URL中使用的别名来替换server.domain.例如,myapp.
  2. 请按照计算机上的以下步骤操作.

转到该站点并取消登录对话框.让这件事发生:

在此输入图像描述

在IE的设置中:

在此输入图像描述

在此输入图像描述

在此输入图像描述

  • 我们正在使用 Windows Server 2012,这是唯一适合我们的解决方案。多谢! (2认同)

Sea*_*ley 5

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

<identity impersonate="true" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


小智 5

这为我修好了.

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

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

  2. 然后转到客户端PC .. IE8或9-工具 - 互联网选项 - 安全 - 本地内联网 - 站点 - 高级 - 添加您的网站(取消"需要服务器verfi ..."ticketmark..no需要

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

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

  5. 确保,因为您的客户端PC是域的一部分,您必须有一个GPO用于此设置,...当用户下次登录到Windows时,此设置将恢复

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

Dan*_*nte 4

可能与浏览器有关。如果您使用的是 IE,您可以转到“高级设置”并检查“启用 Windows 集成身份验证”复选框是否已选中。