无法获得Windows身份验证以通过本地IIS工作


69

因此,我使用Intranet模板创建了一个新的ASP.NET MVC项目。web.config包含适当的值(例如<authentication mode="windows"/>)。

如果我使用VS网络服务器启动Web应用程序,则一切看起来都很好-该页面显示了我的Windows域和用户名以及所有内容。但是,这在Opera和Safari以及IE和FF中都可以使用,这对我来说根本不使用Windows身份验证(据我所知,除IE / FF以外,该功能在任何浏览器中均不起作用)。

下一步是使其通过本地IIS运行。我创建一个主机文件条目,将www.mysite.mydomain指向127.0.0.1。因此,在IIS中,我创建一个具有www.mysite.mydomain绑定的网站,并启用Windows身份验证并禁用匿名身份验证。

我已经设置IE和FF来启用Windows身份验证,如下所示:

IE浏览器

  1. 将URL添加到Intranet组
  2. 确保在高级设置中启用了Windows身份验证

FF

将“ www.mysite.mydomain”放入network.automatic-ntlm-auth.trusted-uris配置设置。

但是,当我在IE / FF中拨打www.mysite.mydomain时,会出现登录提示。有趣的是,即使我在此处输入Windows登录名,它仍然会失败并再次显示登录提示。

我们这里没有活动目录,但我的理解是,该目录应与本地帐户配合使用。

我想不起我需要做的其他事情。有什么建议?

编辑:我们最近切换到使用Active Directory,问题仍然存在。

编辑:当我取消登录提示时,我进入带有以下信息的“ IIS 7.5详细错误”页面:

HTTP错误401.2-未经授权由于身份验证标头无效,您无权查看此页面。**


您是否尝试过<system.webServer>部分中的“安全性”配置?像这样的东西:<security> <authentication> <windowsAuthentication enabled =“ true” /> </ authentication> </ security>
Gabe Thorns

还是<system.web>下的Authorization配置?像<authorization> <allow users =“ Domain \ Name” /> <deny users =“?” /> <deny users =“ *” /> </ authorization>一样,IIS通常使用此部分来控制对资源的授权访问
加布·索恩

您是否按照此处所述打开了Windows身份验证模块?
霍克2011年

1
您可以登录到服务器并尝试localhost // <网站文件夹>并查看登录是否成功吗?您可以使用您的凭据,也可以尝试使用服务器的凭据登录。
Yogesh Jindal

大卫,我已经更新了答案。如果您有机会查看它,请告诉我它是否解决了您的问题。
彼得

Answers:


138

您必须将在hosts文件中指定的域列入白名单,才能使Windows身份验证起作用:

  1. 单击开始,单击运行,键入regedit,然后单击确定。
  2. 在注册表编辑器中,找到以下注册表项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
  3. 右键单击“参数”,单击“新建”,然后单击“ DWORD(32位)值”。
  4. 键入DisableStrictNameChecking并按Enter。
  5. 双击DisableStrictNameChecking注册表值,然后在“数值数据”框中键入1,然后单击“确定”。
  6. 在注册表编辑器中,找到并单击下面的注册表项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  7. 用鼠标右键单击MSV1_0,指向新建,然后再单击多字符串值。
  8. 键入BackConnectionHostNames,然后按Enter。
  9. 用鼠标右键单击BackConnectionHostNames,然后单击修改。
  10. 在“数值数据”框中,键入主机名或本地计算机上站点的主机名,然后单击“确定”。
  11. 退出注册表编辑器,然后重新启动IISAdmin服务。

注意:此答案上的原始Microsoft KB链接已损坏,已被删除。 本文提供了有关设置DisableStrictNameChecking的说明。


1
这是一个非常有趣的建议。不幸的是,我不再在出现此问题的地方工作,因此无法验证此答案。
大卫

8
我可以验证这个答案。我花了几个小时在谷歌上搜索,最后这个regedit的答案有所帮助。谢谢!
JozefKrchňavý2012年

6
我已经使用Win8和IIS8进行了验证-主要问题是定义自定义主机名,然后在我网站的主机头中使用它。另外,我没有将DisableStrictNameChecking设置为1,并且步骤2-8起作用了。
SwampyFox

4
在Win7上验证步骤2-8。不需要执行步骤1,将DisableStrictNameChecking设置为1。
杰里米·库克

1
问题实际上不在于IIS,而在于Windows身份验证本身。请注意,该解决方案为BackConnectionHostNames中指定的主机名禁用了SMB Reflection攻击保护。在此处可以找到有关攻击的很好的解释。
Max Kiselev 2015年

7

您是否尝试过将域放在用户名之前?

DOMAIN\username

如果您没有域帐户,请尝试使用计算机名称为用户名添加前缀:

MYCOMPUTER\myusername

7

最近,我花了三天的时间来解决同一问题,这让我发疯了。它发生在负载平衡的设置中,其中一台服务器正确进行身份验证,而另一台服务器失败。调查该问题并最终解决了该问题,事实证明该问题与负载平衡的环境无关,使用Windows身份验证进行身份验证时,任何服务器都可能发生此问题,并且使用非Active Directory识别的名称来调用该服务器

1.启用Kerberos日志记录

为了正确诊断问题,您将需要在托管IIS站点的计算机上启用Kerberos登录。为此,添加以下注册表项:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parameters

添加具有ValueType REG_DWORD和值 0x1的注册表值LogLevel

一旦打开日志记录,然后尝试进行身份验证,就会在Windows应用程序日志中记录错误。您可以忽略错误KDC_ERR_PREAUTH_REQUIRED(这只是握手的一部分),但是如果收到错误KDC_ERR_C_PRINCIPAL_UNKNOWN,则意味着您的AD控制器无法识别您的服务器,因此您需要执行以下步骤。

2. KDC_ERR_C_PRINCIPAL_UNKNOWN

如果获取的是KDC_ERR_C_PRINCIPAL_UNKNOWN,则意味着名称“ mysite.mydomain.com”与AD识别您的计算机的方式不同,因此无法提供有效的kerberos票证。在这种情况下,您需要在AD上为“ www.mysite.mydomain”注册一个服务主体名称(SPN)。

在AD控制器上,运行以下命令-您将需要Domain Admin特权:

Setspn -A HTTP/mysite.mydomain YOUR_MACHINE_HOSTNAME

3.为您的应用程序池使用自定义身份

最后,使您的应用程序池使用属于Active Directory的自定义帐户,而不是使用NetworkService。这可以在应用程序池的高级设置中完成。

和..瞧。


注意:问题可能(不太可能)与在同一台计算机上注册多个SPN有关,在这种情况下,您将需要运行命令来删除重复的SPN,但是我怀疑是这种情况。还可以尝试向您的站点(不使用自定义名称)添加其他绑定(例如htttp:// localhost:custom_port_number),并查看身份验证是否有效。如果有效,则表明您遇到了与我同样的问题。


5

您应该检查是否已安装/启用Windows身份验证。这听起来可能很奇怪,但是在IIS 7中,您必须安装并启用各种身份验证方法。请访问http://support.microsoft.com/kb/942043/了解更多信息,请参阅下面引用的部分。

原因1
Web应用程序被配置为使用集成Windows身份验证。但是,Windows身份验证功能未打开。或者,ApplicationHost.config文件或Web.config文件的“集成Windows身份验证本机模块”部分无效。要解决此问题,请参阅解决方案1。

原始
通常,当您尝试查看IIS上托管的asp.net网页并收到登录提示时,这并不意味着未收到您的凭据或未通过身份验证。这意味着您的网站所运行的帐户没有使用这些文件的正确权限。

在IIS 6和IIS 7中,您可以轻松更改运行应用程序池的用户帐户。尝试将应用程序池标识更改为具有为此目的专门设计的更多访问权限的帐户。或者,如果您想使用现有帐户(IUSR_?网络服务?),则可以向该帐户授予网站存储目录的更多权限。

本文专门针对BizTalk,但几乎没有引用它,并且着重于解决IIS和应用程序池的权限问题:http : //msdn.microsoft.com/zh-cn/library/aa954062.aspx


1
谢谢你的建议。这不是文件夹权限。我可以告诉应用程序池使用我的管理员帐户,问题仍然存在。另外,我从IIS获得有关身份验证标头的特定消息(添加到上面的问题中)。
大卫,

@David-用一些新信息更新了我的答案。
彼得

4

为什么要使用本地IIS?可以使用本地IIS Express吗?

如果是这样,请尝试此。似乎IIS Express默认将Windows身份验证设置为false。

更改

<windowsAuthentication enabled="false">

在applicationhost.config文件(在“ C:\ Users [Profile] \ Documents \ IISExpress \ config”文件夹下)中为“ true”。这对我有用。


2

为了确保IIS使用Windows身份验证,我认为您应该尝试使用其他身份验证方法。如果启用了匿名身份验证,则Windows身份验证将不起作用。您还可以阅读此Microsoft支持文章,其中详细描述了IE和IIS要求。


1
确实有可能同时具有匿名身份验证和Windows身份验证。我在web.config中执行以下操作:<system.web> <compilation targetFramework =“ 4.5” /> <httpRuntime targetFramework =“ 4.5” /> <authorization> <deny users =“?” /> </ authorization> <customErrors mode =“ Off”> </ customErrors> <authentication mode =“ Windows” /> </system.web> <location path =“ RemoteData”> <system.web> <authorization> < allow users =“ *” /> </ authorization> </system.web> </ location>
Squazz

您让我解决了问题,请参阅我的答案。+1
罗兰

0

启用Windows身份验证时出现此错误。我想基于Windows登录名授权用户,而我的应用程序中没有登录页面。

通过在Web config文件中添加以下内容,我修复了错误。在标记下system.web,我更改authentication mode="None"authentication mode="Forms"

在标记下appSettings,我添加了add key="owin:AutomaticAppStartup" value="false"


身份验证模式=“表单”?当您尝试实现Windows身份验证时?那将是身份验证模式=“ Windows”吗?
Kurkula

0

阅读了Espen Burud的答案后,我通过更改根目录的web.config解决了我的问题:

<allow users="*" />

<deny users="?" />

需要Windows身份验证的页面不在根目录中,而是在具有自己的web.config的子目录中,deny users ?但无法使Windows身份验证正常工作。显然,您需要拒绝root用户才能正常工作。

IIS配置启用了匿​​名身份验证;没关系。完成以上对web.config的更改后,Windows身份验证即可正常工作。


-1

对于Dot Net Core 2.2并在IIS上运行,我在检查应用程序中的“启用Windows身份验证”时遇到401.2未经授权的问题。这是一个极其简单的测试网站,基本上什么也没做,只是试图使Windows身份验证起作用。我终于可以使用身份验证了,这是您需要的:

在启动ConfigureServices中:

services.AddAuthentication(IISDefaults.AuthenticationScheme);

打开应用程序的属性,单击左侧的“调试”选项,并确保选中“启用Windows身份验证”。

在此处输入图片说明

但是,这是我忘记的关键…… 将您的系统配置为在IIS上安装Windows身份验证。这从来没有在我的机器上设置,无论我做了什么,我总是会收到401未经授权的错误。安装此程序(Win 10,IIS v10.0.18362.1)后,我现在得到一个登录提示。目前,这并不是我真正需要的,但至少不是未经授权的错误。祝您好运,希望对您有所帮助。

在此处输入图片说明


所以,它没有任何上下文或解释就被否决了吗?也许这不是一个很好的答案,但如果我理解为什么它被否决,我肯定可以解决它。但是,是的,我确定您现在感觉很强大。
RichieMN
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.