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

如何获取签名密钥在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:关闭该选项会绕过令牌过期检查,生产环境必须开启以保障安全。

额外检查点:

  1. 确认API应用注册中,已将Angular SPA的应用ID添加到「API权限」并完成管理员同意。
  2. 确认Angular SPA请求令牌时,aud(受众)参数与API配置的Audience一致(可为API的应用ID URI或应用ID)。
  3. 检查ValidIssuer的格式是否与JWT中的iss完全一致(包括结尾的斜杠)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:13:15