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

ASP.NET Core 6 Web API Azure IAM令牌验证遇未授权问题求助

解决Azure AD令牌保护API时的Unauthorized问题

你的配置和代码存在几个关键错误,导致令牌验证失败,以下是具体修正方案:

1. 核心配置错误修正

(1)Issuer格式不正确

Azure AD的令牌Issuer必须包含端点版本后缀:

  • 若使用v2.0端点:https://login.microsoftonline.com/{tenant-id}/v2.0
  • 若使用v1端点:https://sts.windows.net/{tenant-id}/
    你当前的配置缺少版本后缀,会导致Issuer验证不通过。

(2)Audience配置错误

API的Audience应该是Azure AD应用注册中API的Application ID URI(在「公开API」页面设置,通常格式为api://{api-client-id}或自定义URI),而不是网站域名https://{domain}.azurewebsites.net,除非你已将该域名配置为Application ID URI。

(3)IssuerSigningKey完全错误

Azure AD的JWT令牌采用非对称RSA加密签名,而非对称密钥,因此你不需要手动设置IssuerSigningKey,也不能用客户端密钥填充。正确的做法是让JwtBearer中间件自动从Azure AD的元数据端点获取公钥进行验证。

(4)TokenValidationParameters的错误开关

你关闭了ValidateLifetime和ValidateIssuerSigningKey,这两个是令牌验证的核心步骤,必须开启:

  • ValidateLifetime:验证令牌是否过期
  • ValidateIssuerSigningKey:验证令牌签名的合法性

2. 修正后的Program.cs代码

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = $"https://login.microsoftonline.com/{builder.Configuration["AzureAd:TenantId"]}/v2.0";
        options.Audience = builder.Configuration["AzureAd:Audience"];
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true
        };
    });

// 注意:必须添加以下两行,且顺序不能错
app.UseAuthentication();
app.UseAuthorization();

对应的配置文件(appsettings.json)示例:

{
  "AzureAd": {
    "TenantId": "你的租户ID",
    "Audience": "你的API的Application ID URI"
  }
}

3. 额外排查步骤

  • 解析你获取的令牌,检查iss(签发者)和aud(受众)字段是否与配置完全一致(大小写、后缀都不能有差异)
  • 确保获取令牌时,请求的scope参数包含API的权限(比如api://{api-client-id}/access_as_user)
  • 确认API应用注册中已添加对应的客户端应用权限,并完成管理员同意操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:25:02