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

添加OnTokenValidated后,向API后端发送Azure令牌持续返回401未授权错误

排查 Azure AD 认证后 API 返回 401 Unauthorized 的问题

我之前也碰到过类似的踩坑经历,结合你描述的场景,咱们一步步拆解可能的原因和解决办法:

1. 先检查 OnTokenValidated 中间件的逻辑

这个回调里的任何未处理异常都会直接触发 401,是最容易被忽略的点:

  • 确保回调内的逻辑没有抛出隐形错误,比如可以加个 try-catch 捕获异常,或者用 context.Fail() 明确标记认证失败:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = $"https://login.microsoftonline.com/{Configuration["AzureAd:TenantId"]}";
        options.Audience = Configuration["AzureAd:ClientId"]; // 或你的API应用ID URI
        options.Events = new JwtBearerEvents
        {
            OnTokenValidated = context =>
            {
                try
                {
                    // 你的自定义验证逻辑,比如检查特定Claim
                    var userId = context.Principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
                    if (string.IsNullOrEmpty(userId))
                    {
                        context.Fail("Missing user ID claim");
                    }
                }
                catch (Exception ex)
                {
                    context.Fail($"Token validation failed: {ex.Message}");
                }
                return Task.CompletedTask;
            }
        };
    });
  • 另外,确认 TokenValidationParameters 里的 ValidAudience 和 ValidIssuer 与API的Azure注册信息完全匹配。

2. 验证前端获取的令牌受众(Audience)是否正确

前端用 adal-react 请求令牌时,必须指定后端API的标识,而不是前端自己的Client ID:

const adalConfig = {
    clientId: "你的前端Client ID",
    tenant: "你的租户ID",
    redirectUri: window.location.origin,
    cacheLocation: "localStorage",
    resource: "api://你的后端API Client ID" // 这里要填API的应用ID URI或Client ID
};

可以把前端拿到的令牌复制到 jwt.ms 解码,查看 aud 字段是否和后端API配置的 Audience 一致——如果受众不匹配,API会直接拒绝令牌。

3. 核对 Azure AD 应用注册的权限配置

  • 前端应用注册:必须在「API权限」里添加对后端API的委托权限,并且已经完成「管理员同意」(如果是租户内应用);
  • 后端API应用注册:要确保已经暴露了正确的API范围,且前端应用已被授予该范围的权限。

4. .NET Core 2 版本的兼容性细节

.NET Core 2 的 JWT 认证中间件对 Azure AD 令牌有一些特定要求:

  • 确保安装的 Microsoft.AspNetCore.Authentication.JwtBearer NuGet 包版本与 .NET Core 2 匹配(比如 2.2.x 系列);
  • Authority 必须指定具体租户ID,不要用 common(除非是多租户应用)。

5. 确认 appsettings 配置的准确性

检查 appsettings.json 里的 Azure AD 配置项,确保没有拼写错误:

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "你的租户ID",
    "ClientId": "你的后端API Client ID"
}

建议排查顺序:先解码令牌确认受众和签发者 → 检查 OnTokenValidated 逻辑是否有异常 → 核对 Azure AD 应用权限配置 → 最后验证 .NET Core 中间件配置。

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:14:58