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

时间:2011-03-23 08:08:48

标签: 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>

通过这种设置,我期待Windows用户的场景验证背后允许访问和拒绝匿名用户。但是,当我尝试访问该站点时,我得到的是Windows登录弹出窗口。

我几天来一直在解决这个问题,但无法解决问题。基于具有类似问题的帖子,我确认我的URL不包含任何句点,请仔细检查我的IE设置是否设置为启用集成Windows身份验证,还将我的URL添加到我的Intranet站点,但仍然获得弹出窗口。< / p>

为了进一步排除故障,我在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上,但感谢任何人可能有的建议,因为我已经解决了这几天。

23 个答案:

答案 0 :(得分:83)

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

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

我遇到了同样的问题:

login prompt

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

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

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

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

    现在进入身份验证

    的功能

    Authentication Features

    使用IUSR启用匿名身份验证

    Anonymous Authentication

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

    NTLM必须是第一个!

    Windows Authentication

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

    Advanced Settings

    一旦我这样做,我就回到我的网络应用程序,点击浏览链接,然后登录而无需再次提供我的凭据。

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

答案 1 :(得分:38)

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

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

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

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

答案 2 :(得分:26)

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

的Daudi

答案 3 :(得分:14)

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

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

答案 4 :(得分:12)

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

答案 5 :(得分:6)

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

  1. 获取在URL中使用的别名以替换server.domain。例如,myapp。
  2. 请按照计算机上的以下步骤操作。
  3. 转到该站点并取消登录对话框。让这件事发生:

    enter image description here

    在IE的设置中:

    enter image description here

    enter image description here

    enter image description here

答案 6 :(得分:5)

这为我解决了。

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

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

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

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

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

  5. 请确保,由于您的客户端电脑属于域名,因此您必须拥有此设置的GPO,以便当用户下次登录Windows时此设置将恢复

答案 7 :(得分:4)

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列出了五个。

答案 8 :(得分:4)

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

答案 9 :(得分:3)

在我的情况下,授权设置未正确设置。

我不得不

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

    open the .NET Authorization Rules in IIS Manager
  2. 删除 拒绝规则

    remove the Deny Rule

答案 10 :(得分:3)

在我们的Intranet中,通过调整安全性设置来解决客户端问题,如此处所示。右边的任何一个复选框都适合我们。

IE Internet Options

答案 11 :(得分:2)

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

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

<强>解决方案: 我找到了解决方案here。问题是我的测试机器克隆了虚拟机(Windows Server 2008 R2;一个域控制器和一个Web服务器)。两者都有相同的机器SID,这显然导致了问题。这是我做的:

  1. 从域中删除Web服务器。
  2. 在VM中运行c:\ Windows \ System32 \ Sysprep \ Sysprep.exe。
  3. 重新启动虚拟机。
  4. 将网络服务器加入域。
  5. 您在此过程中丢失了一些设置(用户首选项,静态IP,重新创建自签名证书),但现在我已经重新创建了它们,一切正常。

答案 12 :(得分:2)

我也有同样的问题。尝试了在这个论坛和其他论坛上发现的大部分内容。

最后在做了一个自己的RnD之后取得了成功。

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

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

希望这有帮助

答案 13 :(得分:1)

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

答案 14 :(得分:1)

enter image description here 添加到注册表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa solved my problem. 

答案 15 :(得分:1)

我尝试了上面的IIS配置技巧和环回注册表黑客,我审查并重新创建了应用程序池权限和其他十几项内容,但仍无法摆脱使用IIS Express在我的开发工作站上运行的身份验证循环或IIS 7.5,来自本地或远程浏览会话。我收到了四个401.2状态回复和一个空白页面。部署到我的IIS 8.5临时服务器的完全相同的站点可以完美运行。

最后,我注意到响应主体中的标记由浏览器呈现为空白,包含成功登录的默认页面。我确定ASP.NET和HTTP的自定义错误处理401错误是阻止/干扰Windows验证我的工作站,但不验证登台服务器。我花了几个小时摆弄这个,但是一旦我删除了401错误的自定义处理,工作站就恢复正常了。我提出这是另一种射击自己的方式。

答案 16 :(得分:0)

创建可在 NTLM 身份验证请求中引用的本地安全机构主机名。

为此,请对客户端计算机上的所有节点执行以下步骤:

  1. 点击Start,点击Run,输入regedit,然后点击OK

  2. 找到并单击以下注册表子项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0

  3. 右键单击 MSV1_0,指向 New,然后单击 Multi-String Value

  4. 在名称列中,键入 BackConnectionHostNames,然后按 ENTER

  5. 右键单击 BackConnectionHostNames,然后单击 Modify

  6. Value 数据框中,输入 CNAME 或 DNS 别名,即使用 对于计算机上的本地共享,然后单击“确定”。

注意

  • 在单独的行中键入每个主机名。如果

  • BackConnectionHostNames 注册表项以 REG_DWORD 类型存在,
    您必须删除 BackConnectionHostNames 注册表项。退出
    注册表编辑器,然后重新启动计算机。

来源:Error message when you try to access a server locally by using its FQDN or its CNAME alias after you install Windows Server 2003 Service Pack 1: Access denied or No network provider accepted the given network path

无论如何,我在 Windows Server 2019 上进行更改后不需要重新启动。

答案 17 :(得分:0)

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

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

正确的设置是 forwardWindowsAuthToken =&#34; true&#34; 现在看来显而易见但是当遇到同样问题的情况很多时,很难确定

修改:我还发现了解决问题的以下Msdn article方面的帮助。

答案 18 :(得分:0)

我遇到了相同的凭据提示问题,并进行了快速搜索,互联网上没有任何内容可以修复它。花了一些时间才找到问题,这是一个愚蠢的问题。

在IIS中 - &gt;高级设置 - &gt;物理路径凭证(为空)

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

希望这有帮助

答案 19 :(得分:0)

在我的情况下,解决方案是(在上面建议的调整之上)重新启动我/用户&#39;本地开发计算机/ IIS(托管服务器)。 我的用户刚刚添加到新创建的AD安全组中 - 在我退出/重新启动计算机之前,策略不适用于用户AD帐户。

希望这会对某人有所帮助。

答案 20 :(得分:0)

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

答案 21 :(得分:0)

IIS7.0或IIS7.5中的Windows身份验证不适用于kerberos(provider = Negotiate) 当应用程序池标识是ApplicationPoolIdentity时 必须使用网络服务或其他内置帐户。 另一种可能性是使用NTLM使Windows身份验证工作(在Windows身份验证,提供程序中,将NTLM置于顶部或取消协商)

chris van de vijver

答案 22 :(得分:-1)

我遇到了同样的问题,它通过将运行Web应用程序的应用程序池的应用程序池标识更改为NetworkService来解决 enter image description here