ASP.NET Core 6 Web API Azure IAM令牌验证遇未授权问题求助
你的配置和代码存在几个关键错误,导致令牌验证失败,以下是具体修正方案:
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
相关产品推荐
相关产品推荐

