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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:25:10