我正在尝试为我的MVC站点创建一个简单的操作过滤器,用于检查当前Windows用户是否允许访问该站点。出于某种原因,filterContext.HttpContext.User.Identity
对象始终设置为匿名,没有用户名。我试图在不同的阶段(OnAuthenticate和OnAuthorize)抓住它,但它总是匿名的。
我目前在IIS中启用了匿名和 Windows身份验证(实际上遵循this example配置了Windows身份验证功能),我在system.web
节点中有以下块我的web.config:
<authentication mode="Windows" />
<authorization>
<allow users="*" />
<deny users="?" />
</authorization>
但由于某种原因,Identity始终是匿名的,没有用户名。我必须在这里遗漏一些东西。在IIS中设置Windows身份验证时,我总是会提示输入用户名/密码组合(实际上它因HTTP401.1错误0xc000006d
而失败,但我认为这可能是因为我有一个用于开发的自定义主机头设置) 。我还阅读了一些文章,建议这是因为我的网站已确定位于 internet 区域,并且答案总是声明将网站添加到 Intranet 区域在Internet Explorer中。这似乎是一个创可贴修复,而不是实际的解决方案。
理想情况下,我想拥有以下内容:
我需要做些什么来实现这个目标?
提前感谢您的帮助。如果我能提供更多背景信息,请告诉我。
编辑:忘记添加我在Windows 7 SP1,IIS 7.5上运行此功能
答案 0 :(得分:1)
在解决方案资源管理器中,在项目上按 F4 ,如果从Visual Studio运行项目,则将 Windows身份验证更改为“启用”;
在 IIS 中选择网站 - &gt; 身份验证和禁用 匿名身份验证,如果启用,请确保“ Windows身份验证”
答案 1 :(得分:0)
尝试
<system.web>
<identity impersonate="true" />
</system.web>
OR
点击项目而非解决方案=&gt;打开属性资源管理器不右键单击属性=&gt;你会发现匿名身份验证设置为禁用
答案 2 :(得分:0)
您需要从iis禁用匿名身份验证并仅启用Windows身份验证。
答案 3 :(得分:0)
这两条规则在您的代码中的顺序错误
<allow users="*" />
<deny users="?" />
由于您首先允许所有人,因此甚至不评估第二条规则。
尝试切换它们
<deny users="?" />
<allow users="*" />
这样您首先拒绝匿名请求,以便身份验证管道甚至可以将401返回给客户端。当NTLM / Kerberos身份验证选择用户名时,第二个规则允许所有人(此时进行身份验证)。
为此,您还必须禁用匿名身份验证。