Excel宏调用.NET Core 8 C# API:基于AD安全获取用户名方案咨询
解决方案步骤
1. 修正.NET Core 8.0中获取用户身份的方式
.NET Core已弃用System.Web.HttpContext.Current,以下是两种正确获取AD认证用户的方式:
- API控制器中直接获取:
控制器可直接通过HttpContext.User.Identity.Name获取用户身份,无需引用System.Web。示例代码:[ApiController] [Route("api/[controller]")] public class AuthController : ControllerBase { [HttpPost("ValidateUser")] public IActionResult ValidateUser() { // 获取AD认证用户名,格式为 DOMAIN\Username string userName = HttpContext.User.Identity.Name; if (string.IsNullOrEmpty(userName)) { return Unauthorized("未通过AD认证"); } // 提取纯用户名并执行数据库验证逻辑 bool isValid = ValidateUserInDatabase(userName.Split('\\')[1]); return isValid ? Ok("验证通过") : BadRequest("用户验证失败"); } private bool ValidateUserInDatabase(string userName) { // 替换为你的数据库验证代码 return true; } } - 非控制器类中获取:
先在Program.cs注册IHttpContextAccessor服务:
再通过依赖注入在类中使用:var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpContextAccessor();public class UserValidationService { private readonly IHttpContextAccessor _httpContextAccessor; public UserValidationService(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public string GetCurrentUserName() { return _httpContextAccessor.HttpContext?.User.Identity.Name; } }
2. 配置API的Windows AD认证
要让API识别AD用户,需在Program.cs中启用Windows认证:
var builder = WebApplication.CreateBuilder(args); // 添加Windows认证服务 builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(); // 设置默认授权策略,强制所有请求需经过认证 builder.Services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; }); builder.Services.AddControllers(); var app = builder.Build(); // 启用认证、授权中间件 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
注:若部署在IIS上,需在站点身份验证设置中启用Windows身份验证,禁用匿名身份验证。
3. 修改Excel宏请求,自动携带AD身份
无需手动传递用户名,修改VBA代码让请求使用当前Windows用户身份发送:
Sub CallSecureAPI() Dim objHTTP As Object Set objHTTP = CreateObject("MSXML2.XMLHTTP.6.0") Dim apiUrl As String apiUrl = "http://your-api-url/api/Auth/ValidateUser" objHTTP.Open "POST", apiUrl, False ' 启用当前用户的NTLM认证 objHTTP.SetOption 2, objHTTP.GetOption(2) + 13056 objHTTP.Send If objHTTP.Status = 200 Then MsgBox "验证成功:" & objHTTP.ResponseText Else MsgBox "验证失败,状态码:" & objHTTP.Status & ",信息:" & objHTTP.ResponseText End If Set objHTTP = Nothing End Sub
关键注意事项
- 确保API服务器与Excel客户端处于同一AD域或信任域内。
- 禁止API的匿名访问,强制所有请求必须经过AD认证。
HttpContext.User.Identity.Name返回格式为DOMAIN\Username,若数据库仅存纯用户名,需用Split('\\')[1]提取后半段。
内容的提问来源于stack exchange,提问作者Sabyasachi Mukherjee
相关产品推荐
相关产品推荐

