如何在Web API 2中从请求获取远程用户名及域名?
在Web API 2.0中正确获取远程用户名及域名的解决方案
我之前也踩过类似的坑,在Web API 2.0里获取客户端用户的身份信息,关键是要先把身份验证配置对,再用正确的方式调用API,咱们一步步来解决:
先理清你现有代码的问题
你尝试的几个方法大多是因为没配置好验证,或者调用了错误的API导致拿不到正确信息:
WindowsIdentity.GetCurrent().Name:这个获取的是Web API服务器进程运行的账户(比如IIS应用池的账户),不是发起请求的客户端用户,完全不对路。System.Web.HttpContext.Current.User.Identity.Name:Web API里不推荐用HttpContext.Current(在自托管等场景下可能失效),而且如果没启用Windows身份验证,这个值会是空的。Request.ServerVariables["REMOTE_HOST"]:确实只会返回客户端的主机名,不是用户名。Request.ServerVariables["LOGON_USER"]:只有在Windows身份验证成功启用后,这个值才会和用户身份名称一致,否则为空。
第一步:配置Windows身份验证
要拿到客户端的Windows域账户信息,必须先在Web.config里启用Windows身份验证,禁用匿名访问:
<system.web> <!-- 启用Windows身份验证 --> <authentication mode="Windows" /> <authorization> <deny users="?" /> <!-- 拒绝所有匿名请求 --> </authorization> </system.web> <!-- 针对IIS/IIS Express的额外配置 --> <system.webServer> <security> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true" /> </authentication> </security> </system.webServer>
如果是自托管的Web API(不是IIS托管),还要在启动代码里配置身份验证:
var config = new HttpSelfHostConfiguration("http://localhost:8080"); // 添加授权过滤器,拒绝匿名访问 config.Filters.Add(new AuthorizeAttribute()); // 启用Windows身份验证支持 config.MessageHandlers.Add(new HttpClientHandler { UseDefaultCredentials = true }); // 配置路由等其他逻辑...
第二步:在控制器中正确获取用户信息
Web API的ApiController自带User属性,直接用它就能拿到客户端的身份信息,格式就是域名\用户名:
public class UserInfoController : ApiController { [Authorize] // 必须加这个特性,确保只有验证过的用户能访问 public IHttpActionResult GetUserDetails() { var fullUserIdentity = User.Identity.Name; if (string.IsNullOrEmpty(fullUserIdentity)) { return BadRequest("无法获取用户身份,请检查身份验证配置是否正确"); } // 拆分域名和用户名 var identityParts = fullUserIdentity.Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); var domainName = identityParts.Length > 0 ? identityParts[0] : string.Empty; var userName = identityParts.Length > 1 ? identityParts[1] : fullUserIdentity; return Ok(new { FullUserName = fullUserIdentity, Domain = domainName, UserName = userName }); } }
额外注意事项
- 如果是浏览器调用API,要确保浏览器会发送Windows凭据:IE/Edge默认会给信任站点发送,Chrome/Firefox需要把API地址加入信任站点列表。
- 如果是用
HttpClient调用API,要设置UseDefaultCredentials = true才会带上当前用户的域凭据:
using (var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true })) { var response = await client.GetAsync("http://your-api-address/api/UserInfo"); // 处理响应... }
内容的提问来源于stack exchange,提问作者radhey_mishra
相关产品推荐
相关产品推荐

