如何获取签名密钥在ASP.NET Core中验证Entra AD颁发的JWT令牌
问题描述
我有一个Entra/Azure AD应用注册,供小型Angular SPA用于向ASP.NET Core Web API进行身份认证。解码JWT后,iss(颁发者)为:
"iss": "https://sts.windows.net/64..............a21/",
我的Program.cs配置如下:
builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(o => { o.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = builder.Configuration["https://login.microsoftonline.com/64..............a21"], ValidAudience = builder.Configuration["http://localhost:5036/"], IssuerSigningKey = new SymmetricSecurityKey (Encoding.UTF8.GetBytes(builder.Configuration["?????"])), //此处为缺失部分 ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = false, ValidateIssuerSigningKey = true }; });
在本地开发模式下运行Angular应用和API时,我遇到了HTTP 401错误。我是按照官方指南完成应用注册的。请问我该如何获取签名密钥,以便应用能够验证Azure颁发的JWT令牌?
解决方案
你不需要手动配置IssuerSigningKey,Azure AD的JWT令牌使用非对称加密(RSA)签名,而非对称密钥。正确做法是让ASP.NET Core自动从Azure AD的元数据端点获取公钥验证签名,而非手动指定对称密钥。
修改你的Program.cs配置,替换现有TokenValidationParameters的配置逻辑:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://login.microsoftonline.com/64..............a21/v2.0"; options.Audience = "http://localhost:5036/"; // 或你的API应用ID URI // 兼容旧版STS颁发的令牌(你的iss为sts.windows.net开头),可添加以下配置 options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "https://sts.windows.net/64..............a21/", ValidateLifetime = true // 建议开启生命周期验证,关闭存在安全风险 }; });
关键说明:
Authority:设置为你的租户Azure AD元数据端点,格式为https://login.microsoftonline.com/{租户ID}/v2.0(v2.0端点兼容v1和v2版本令牌)。ASP.NET Core会自动从此端点获取jwks_uri,下载用于验证签名的公钥,无需手动配置IssuerSigningKey。ValidIssuer:必须与JWT中的iss值完全匹配(包括结尾斜杠),确保颁发者验证通过。- 禁用
SymmetricSecurityKey:Azure AD不会用对称密钥签名令牌,手动配置会导致验证失败,这是你遇到401的核心原因。 - 开启
ValidateLifetime:关闭该选项会绕过令牌过期检查,生产环境必须开启以保障安全。
额外检查点:
- 确认API应用注册中,已将Angular SPA的应用ID添加到「API权限」并完成管理员同意。
- 确认Angular SPA请求令牌时,
aud(受众)参数与API配置的Audience一致(可为API的应用ID URI或应用ID)。 - 检查
ValidIssuer的格式是否与JWT中的iss完全一致(包括结尾的斜杠)。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

