You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:17:33