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

Posted

技术标签:

【中文标题】使用集成 Windows 身份验证接收登录提示【英文标题】:Receiving login prompt using integrated windows authentication 【发布时间】:2011-07-21 02:49:11 【问题描述】:

我有一个在 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 上,但感谢任何人可能提供的任何建议,因为这几天以来一直在解决这个问题。

【问题讨论】:

身份验证和模式之间应该有一个空格,例如:&lt;authentication mode="Windows" /&gt; 希望这只是您的问题中的拼写错误? 您在服务器 2003 上运行的 iis 7,您确定我几乎肯定这是不可能的。 【参考方案1】:

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

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

我也遇到了同样的问题:

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

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

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

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

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

使用IUSR 启用匿名身份验证

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

NTLM 必须是第一位的!

接下来,检查 Advanced Settings... 下的 Extended Protection 是否为 AcceptEnable Kernel-mode authentication strong> 已检查:

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

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

【讨论】:

谢谢,苏杰。我注意到 SO 上的大多数这些技术都没有图片来显示他们在说什么,所以我想展示我使用的所有步骤。如果这对某人不起作用,至少他们可以看到他们采取的所有步骤,以及可以尝试的其他选项。 这太神奇了,我因此而发疯。这些照片让它变得容易多了。谢谢!! 它也对我有用,但最后我不得不重新启动我的 Windows 2008 r2 实例。我认为提及它可能很重要。 不适用于运行 IIS 8.5 的 Windows Server 2012 这不只是启用匿名身份验证,从而允许忽略 Windows 身份验证吗?真正的问题,这就是上面对我的看法。【参考方案2】:

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

按照这篇支持文章解决问题:

https://webconnection.west-wind.com/docs/_4gi0ql5jb.htm(原版,现已失效:http://support.microsoft.com/kb/896861)

来自支持文章,以确保它不会丢失:

解决方法是禁用此策略的注册表黑客 明确的。

执行此操作 配置手动在服务器上的注册表中找到这个key:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

并编辑或添加新密钥:

DisableLoopbackCheck(双字)

然后将值发送到 1 以禁用环回检查(本地 身份验证有效),或为 0(不允许本地身份验证)。

或者您可以更轻松地使用 Powershell:

New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name "DisableLoopbackCheck" -Value "1" -PropertyType dword

看起来像 Windows 10(1803 及更高版本?)的最新版本也需要这个 配置设置以便在本地进行身份验证。

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

【讨论】:

你先生是我的f*g英雄!我已经通过了很多“解决方案”来解决这个问题。谢谢! 天哪!两天努力把这件事付诸实践,终于你给了我答案!谢谢! 在翻了多个答案后,看到配置和我的一样,这就是答案! 你的传奇!这对我有用。我花了很长时间才找到这个。 @PTD 更新了新文章并为后代添加了摘要,因此它不会丢失。 MS 支持永久链接就这么多!【参考方案3】:

我有一个类似的问题,我只想保护我网站的特定部分。除了在 IE 中,一切都运行良好。我同时启用了匿名和 Windows 身份验证。 对于匿名,身份设置为应用程序池身份。问题出在 Windows 身份验证上。经过一番挖掘后,我启动了 fiddler,发现它使用 Kerberos 作为提供程序(实际上它默认设置为协商)。我将它切换到 NTLM 并修复了它。 高温

道迪

【讨论】:

帮我搞定了,谢谢!在本地访问时,我能够获取 Windows 用户,但凭据请求会从域中的任何其他计算机弹出。 @Daudi 你如何设置每个身份验证方法的身份?【参考方案4】:

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

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

【讨论】:

有关如何执行此操作的步骤会有所帮助。 +1。你拯救了我的一天和我的理智。非常感谢!【参考方案5】:

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

【讨论】:

这为我修好了。 除非您当然不希望 NTLM 在您的列表中排在首位...采取此操作会产生后果,任何进行此类更改的人都应该了解 NTLM 和协商之间的区别(在最基本的level Negotiate 首先尝试 Kerberos 身份验证,如果失败则回退到 NTLM)。如果您想要 Kerberos(很多都想要),那么这不是一个好的解决方案。这里有一些细节:msdn.microsoft.com/en-us/library/aa480475.aspx【参考方案6】:

如果您的 URL 的域名中有圆点,IE 会将其视为 Internet 地址,而不是本地地址。您至少有两种选择:

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

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

在 IE 的设置中:

【讨论】:

我们使用的是 Windows Server 2012,这是唯一对我们有用的解决方案。非常感谢!【参考方案7】:

这为我解决了问题。

我的服务器和客户端电脑是 Windows 7 并且在同一个域中

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

    然后去客户端PC..IE8或9-工具-internet选项-安全-本地Intranet-站点-高级-添加你的站点(去掉“需要服务器验证...”标签..不需要

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

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

    确保,由于您的客户端电脑是域的一部分,因此您必须有一个 GPO 才能进行此设置,否则此设置将在用户下次登录 Windows 时恢复

【讨论】:

对于 1) 我实际上启用了模拟和 Windows 身份验证,一切都很好。对我来说,关键是 2) 将远程站点地址添加到本地 Intranet 区域的位置。【参考方案8】:

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

<identity impersonate="true" />

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

但您最初的问题是,似乎无法确定身份并且您收到了一个登录弹出窗口。我会注意到,如果您在 IIS 中禁用了匿名身份验证,则不需要 &lt;deny&gt; 块。我们从不包含它(除了特殊的&lt;location&gt; 块等),所以我想说你可以尝试删除它并重试。不过,其他一切听起来都不错。

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

您还可以检查 IIS 日志以查看返回的响应。它很可能是 401,但它后面应该有一个子编号,例如 401.2 或其他东西。该子编号有时可以帮助确定根本问题。这个KB article 列出了五个。

【讨论】:

+1 用于提及 SPN 的要求。事实上,我遇到的登录弹出窗口的大部分问题都是由于 Kerberos 环境中缺少 SPN。【参考方案9】:

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

【讨论】:

【参考方案10】:

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

我不得不

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

    删除 拒绝规则

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

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

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

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

您在此过程中丢失了一些设置(用户首选项、静态 IP、重新创建自签名证书),但现在我重新创建了它们,一切正常。

【讨论】:

当您尝试设置约束委派时,克隆很糟糕。【参考方案13】:

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

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

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

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

希望对你有帮助

【讨论】:

您在说什么权限选项?你能提供更详细的步骤吗?【参考方案14】:

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

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

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

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

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

正确的设置是 forwardWindowsAuthToken="true",现在看起来很明显,但是当同一问题出现这么多情况时,就很难确定

编辑:我还发现以下 Msdn article 对解决问题很有帮助。

【讨论】:

【参考方案17】:

将 添加到注册表

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

【讨论】:

我把这个小屏幕复制给我的管理员,我们已经尝试了几个小时的问题得到了解决。【参考方案18】:

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

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

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

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

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

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

    右键单击BackConnectionHostNames,然后单击Modify

    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 上进行更改后,我不需要重新启动。

【讨论】:

【参考方案19】:

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

克里斯·范·德·维维尔

【讨论】:

不正确。重新启动您的服务器。请注意它现在有效。应用修补程序 KB2545850。 哇。重新启动只是为我修复了它。现在需要检查多久。有任何想法吗?尚未调查 Hotfix。 我们遇到了完全相同的情况 - 在重新启动之前,协商无法与 ApplicationPoolIdentity 一起使用。【参考方案20】:

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

【讨论】:

【参考方案21】:

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

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

【讨论】:

【参考方案22】:

我遇到了同样的凭据提示问题,并进行了快速搜索,但互联网上没有任何东西可以解决它。花了一些时间才发现问题,一个愚蠢的问题。

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

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

希望对你有帮助

【讨论】:

【参考方案23】:

我遇到了同样的问题,通过将运行 Web 应用程序的应用程序池的应用程序池标识更改为 NetworkService 解决了这个问题

【讨论】:

以上是关于使用集成 Windows 身份验证接收登录提示的主要内容,如果未能解决你的问题,请参考以下文章

使用集成 Windows 身份验证或 NTLM 登录 Jira

SQL Server 集成身份验证模式

IIS Windows集成身份验证替代方法?

尽管如此,使用 Windows 身份验证的 IIS Web 应用程序仍会生成登录提示

SQL server2000 windows身份验证失败怎么办

SQL server2000 windows身份验证失败怎么办