我最近遇到了一个棘手的问题:如何让Windows身份验证在本地IIS 7.5(Windows 7 Pro)实例上运行到ASP.NET4.0网站.我遵循了基本的步骤.

IIS身份验证

  • 禁用匿名身份验证
  • 启用Windows身份验证

编辑网页.配置

<authentication mode="Windows" />

这在启用Windows身份验证方面做得很好,但每次try 登录都被拒绝,最终返回401.1错误.问题就是从这里开始的.出现这种情况的原因似乎有很多,在网络上都有很好的记录,包括这里的堆栈溢出.

我试过了:

  • Editing IIS身份验证 'Advanced settings' for Windows Authentication to disable Extended Protection and Kernel-mode authentication
  • Editing IIS身份验证 'Providers' to move NTLM above Negotiate.
  • 编辑IIS.NET授权规则以明确允许用户(以及各种其他组合).
  • 各种IIS命令行脚本和调整.
  • web.config文件中的各种配置调整.
  • 甚至还有一些文件系统权限的调整.

但一切都无济于事,令人畏惧的401.1人留了下来.

这真的是一个"见木不见木"的例子.我找到的所有解决方案(如果你愿意,可以称之为糟糕的搜索参数)都不适用于我,因此我认为值得发布这个问题,希望能为任何遇到同样问题的人提供一个更容易找到的明确答案.

推荐答案

这里的问题是,现代版本的Windows(Windows XP SP2、Windows Server 2003 SP1及以上)包含一个环回判断安全功能,旨在帮助防止计算机上的反射攻击.因此,如果使用的FQDN或自定义主机头与本地计算机名不匹配,则身份验证将失败.

这可以通过显式指定主机名或禁用环回判断来解决.显然,前者是更受控制的方法.

  1. 将DisableStrictNameChecking注册表项设置为1.请参阅:281308 (Note: This should be unnecessary for Windows Server 2008/Vista and later)
  2. 在注册表编辑器中,找到并单击以下注册表项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  3. 右键单击MSV1_0,指向"新建",然后单击"多字符串值".
  4. 键入BackConnectionHostNames,然后按ENTER键.
  5. 右键单击BackConnectionHostNames,然后单击修改.
  6. 在"值数据"框中,键入主机名或本地计算机上站点的主机名,然后单击"确定".
  7. 退出注册表编辑器,然后重新启动IISAdmin服务.

如何做到这一点的完整细节可以在MSDN:896861上找到

希望这能帮到什么人.如果您有任何替代建议或改进,请添加.

Asp.net相关问答推荐

在Docker Windows中,ASP.NET核心容器在自定义端口8080上运行,但ASP.NET容器在固定端口80上运行

检测 ASP.NET 中的内存泄漏

如何向 Array.IndexOf 添加不区分大小写的选项

jquery 1.9.0 和 modernizr 无法使用 ASP.NET Web 优化框架进行缩小

OnCheckedChanged 事件未触发

将复选框的值传递给 asp.net mvc4 中的控制器操作

Request.Params 和 Request.Form 什么时候不同?

为什么我不能在 ASP.net MVC 中使用服务器控件?

如何将 ASP.NET MVC5 身份验证添加到现有数据库

如何在 ASP.NET MVC3 中配置区域

ASP.NET Core 2.0 为同一端点结合了 Cookie 和承载授权

如何针对异常需求自定义 ASP.NET Web API AuthorizeAttribute

如何在 ASP.NET MVC 中启用跨源请求

SignalR /signalr/hubs 404 未找到

当.NET抛出WebException((400)错误请求)时如何处理WebResponse?

在资源文件中使用 HTML

远程计算机无法连接到 Visual Studio Web 服务器

如何将我的 Autofac 容器插入 ASP. NET 身份 2.1

ASP.NET Excel 导出编码问题

目录与目录信息