Web API 2配置权限时,Controller无法获取IPrincipal.User.Identity.Name
Web API 2中IPrincipal.User无法获取用户名的问题解决
我之前在配置Web API 2的Windows认证时也碰到过一模一样的问题——明明已经开了Windows认证,ApiController.User就是拿不到用户名,但HttpContext.Current.Request.LogonUserIdentity.Name却能正常工作。这里给你拆解下原因和解决步骤:
为什么会出现这个差异?
LogonUserIdentity是直接从当前HTTP请求的底层Windows身份标识中读取信息,绕开了Web API自身的身份验证管道;而ApiController.User依赖于Web API是否正确将主机(IIS/IIS Express)的身份验证结果绑定到控制器的IPrincipal实例上。默认情况下,Web API 2并不会自动完成这个绑定,所以才会出现前者能用后者不行的情况。
解决步骤(需要做这几个配置)
1. 完善Web.Config的认证授权配置
除了你已经设置的<authentication mode="Windows" />,还要补充以下配置:
<!-- 拒绝匿名访问,强制身份验证 --> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> <!-- 在IIS层面启用Windows认证,禁用匿名 --> <system.webServer> <security> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true" /> </authentication> </security> </system.webServer>
2. 配置Web API的身份验证管道
打开App_Start/WebApiConfig.cs,添加以下代码,让Web API明确使用主机提供的Windows身份,并绑定到控制器的User属性:
using System.Web.Http; using System.Web.Http.Authentication; public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 其他路由配置... // 禁用默认的主机身份验证,然后显式添加Windows身份验证过滤器 config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(DefaultAuthenticationTypes.Windows)); } }
3. 确保本地调试的IIS Express设置正确
本地运行时,IIS Express默认可能开启了匿名认证,需要手动关闭:
- 右键你的项目 → 选择「属性」→ 切换到「Web」标签页
- 服务器选择「IIS Express」,点击「创建虚拟目录」确保配置生效
- 点击「编辑配置文件」,找到对应站点的配置节点,确认:
<site name="YourProjectName" id="2"> <!-- 其他配置... --> <applicationHost> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true" /> </authentication> </applicationHost> </site>
验证配置
完成以上步骤后,重启你的应用,现在在ApiController里就能通过User.Identity.Name获取当前用户名了,和LogonUserIdentity.Name的结果一致,之后你就可以用这个用户名去AD里查询用户组做权限判断了。
内容的提问来源于stack exchange,提问作者slee423
相关产品推荐
相关产品推荐

