我最近遇到了一个棘手的问题:如何让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相关问答推荐

Visual Studio发布的网站得到错误类型JObject is not defined when page is load on server"''"

如何根据另一个下拉列表中的 Select 从下拉列表中删除一个值?

在每个对象上设置 ClientIDMode = Static 是否有任何缺点(在母版页的 maincontent 上设置)

如何在运行时判断动态数据类型的类型?

如何将 JQuery 与母版页一起使用?

为什么微软决定支持 jQuery 如此重要?

创建一个供 ASP.NET 应用程序中的所有线程使用的静态 Regex 对象是否有效?

在每页级别增加 ASP.Net 超时

无法读取配置部分system.servicemodel,因为它缺少部分声明

如何在 ASP.NET core rc2 中禁用浏览器缓存?

从 RowDataBound 事件的 gridview 从单元格中获取值

新的 ASP.NET MVC 5 应用程序如何知道如何创建数据库以及帐户控制器如何访问数据库?

ASP.NET MVC 5 中的路由可选参数

Page.IsValid 是如何工作的?

如何使用 WebRequest 发布数据并从网页获取响应

错误请求 - 无效的主机名 ASP.net Visual Studio 2015

Web API 必填参数

MVC3 值 Ajax 文件上传

避免在 ASP.NET MVC 中使用会话状态是一种好习惯吗?如果是,为什么以及如何?

禁用文本框的模型绑定