Windows 身份在 ASP.NET 请求管道中始终是匿名的

Windows Identity always anonymous in ASP.NET request pipeline

我正在尝试为我的 MVC 站点创建一个简单的操作过滤器,用于根据允许访问该站点的用户检查当前 Windows 用户。出于某种原因,filterContext.HttpContext.User.Identity object 始终设置为没有用户名的匿名。我尝试在不同阶段(OnAuthenticate 和 OnAuthorize)获取它,但它始终是匿名的。

我目前在 IIS 中启用了匿名 Windows 身份验证(实际上遵循 this example 配置 Windows 身份验证功能),并且我的 web.config 的 system.web 节点中有以下块:

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

但是由于某种原因,身份始终是匿名的,没有用户名。我必须在这里遗漏一些东西。在 IIS 中设置了 Windows 身份验证后,我总是被提示输入 username/password 组合(实际上失败并出现 HTTP401.1 错误 0xc000006d,尽管我认为这可能是因为我有一个自定义主机 header 开发设置)。我还阅读了一些文章,表明这是因为我的站点被确定为位于 internet 区域并且答案总是声明将站点添加到 intranet Internet Explorer 中的区域。这似乎是 band-aid 修复,而不是实际的解决方案。

理想情况下,我想要以下内容:

  1. 用户浏览到我的网站
  2. 在幕后,他们的 Windows 用户名被提取,并根据应用程序管理的允许用户进行身份验证
  3. 用户身份验证成功,页面加载,用户 none 他们通过身份验证越明智

我需要做什么才能实现这一目标?

在此先感谢您的帮助。如果我可以提供更多上下文,请告诉我。

编辑: 忘记添加我是 运行 这个 Windows 7 SP1,IIS 7.5

尝试

<system.web>
    <identity impersonate="true" />
</system.web>

单击项目而不是解决方案 => 打开属性资源管理器 而不是 右键单击​​属性 => 您会发现匿名身份验证设置为禁用

您需要禁用 iis 的匿名身份验证并仅启用 windows 身份验证。

这两个规则在您的代码中的顺序错误

<allow users="*" />
<deny users="?" />

由于您首先允许所有人,因此甚至不评估第二条规则。

尝试切换它们

<deny users="?" />
<allow users="*" />

这样你首先拒绝匿名请求,这样身份验证管道甚至可以 return 401 到客户端。当 NTLM/Kerberos 身份验证选择用户名时,第二条规则允许所有人(这次已通过身份验证)。

为此,您还必须禁用匿名身份验证。

在您的解决方案资源管理器中,在项目上按 F4,如果您是运行 你的项目来自 Visual Studio;

IIS select 您的 WebSite -> Authentication禁用 匿名身份验证 并确保“Windows身份验证”如果启用