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 修复,而不是实际的解决方案。
理想情况下,我想要以下内容:
- 用户浏览到我的网站
- 在幕后,他们的 Windows 用户名被提取,并根据应用程序管理的允许用户进行身份验证
- 用户身份验证成功,页面加载,用户 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身份验证”如果启用
我正在尝试为我的 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 修复,而不是实际的解决方案。
理想情况下,我想要以下内容:
- 用户浏览到我的网站
- 在幕后,他们的 Windows 用户名被提取,并根据应用程序管理的允许用户进行身份验证
- 用户身份验证成功,页面加载,用户 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身份验证”如果启用