如何通过.NET Core 2+C#内部API获取调用方电脑及用户信息?
好问题!针对你用.NET Core 2开发内部API的场景,获取调用方的Windows用户信息或者IP地址都是可行的,下面分情况给你详细说明:
一、获取发起调用的Windows用户信息
这在内部域环境下是完全可以实现的,核心是依赖Windows身份验证,具体步骤如下:
配置API的身份验证
在Startup.cs的ConfigureServices方法中添加Windows身份验证服务:services.AddAuthentication(IISDefaults.AuthenticationScheme);然后在
Configure方法中启用身份验证中间件(要放在UseMvc之前):app.UseAuthentication(); app.UseMvc();确保部署环境启用Windows身份验证
如果你的API部署在IIS上,需要在IIS站点的“身份验证”设置中,禁用匿名身份验证,启用Windows身份验证。在控制器中获取用户信息
配置完成后,在API控制器的方法中,就可以通过User.Identity获取调用方的Windows用户信息了:[Authorize] [HttpGet("user-info")] public IActionResult GetUserInfo() { var windowsUsername = User.Identity.Name; // 格式通常为:DOMAIN\Username return Ok(new { Username = windowsUsername }); }调用方的配合要求
调用API的客户端(比如桌面应用、PowerShell脚本等)需要传递Windows凭据。例如用HttpClient调用时,要设置UseDefaultCredentials = true:using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.UseDefaultCredentials = true; // 自动传递当前Windows用户凭据 var response = await client.GetAsync("https://your-api-url/user-info"); }
二、获取调用方的IP地址
如果无法获取Windows用户信息(比如不启用Windows身份验证),获取IP地址是更通用的方案,实现起来也很简单:
直接获取远程IP
在控制器方法中,通过HttpContext.Connection.RemoteIpAddress获取:[HttpGet("client-ip")] public IActionResult GetClientIp() { var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString(); return Ok(new { IpAddress = ipAddress }); }处理反向代理场景
如果你的API前面有反向代理(比如Nginx、IIS ARR),上面的方法会拿到代理服务器的IP,而不是真实客户端IP。这时需要配置转发头:
在Startup.cs的ConfigureServices中添加:services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 如果代理服务器是可信的,可以添加到AllowedHosts里,避免伪造头 options.KnownProxies.Add(IPAddress.Parse("192.168.1.100")); // 替换为你的代理IP });然后在
Configure方法中,先启用转发头中间件:app.UseForwardedHeaders(); app.UseAuthentication(); app.UseMvc();配置后,
RemoteIpAddress就会拿到真实的客户端IP了。
总结
- 获取Windows用户信息:可行,但需要配置Windows身份验证,且调用方处于同一域环境并传递凭据;
- 获取IP地址:完全可行,无特殊环境要求,注意处理反向代理场景即可;
- 不存在完全不可行的情况,根据你的内部环境选择合适的方案就好。
内容的提问来源于stack exchange,提问作者boilers222

