【问题标题】:Azure AD Jwt token validation no internetAzure AD Jwt 令牌验证没有互联网
【发布时间】:2025-12-09 10:50:01
【问题描述】:


我有 .net 核心 web api,它在公司内部网 A 的机器上运行,并且无法访问互联网。
然后我在 Intranet B 中有网站,该网站在 Azure AD 中进行了身份验证。
我想将请求从 B 发送到 A,标题为 Authentication: JwtTokenFromAzure
验证此令牌的最佳选择是什么?

【问题讨论】:

    标签: azure authentication .net-core jwt azure-active-directory


    【解决方案1】:

    要验证 id_token 或 access_token,您的应用应同时验证 token 的签名声明。 您可以使用jwt.io 手动验证令牌,也可以使用代码。

    要手动验证令牌,您应该首先验证令牌的签名。 Azure AD 颁发的令牌使用行业标准的非对称加密算法进行签名,JWT 的标头包含有关用于签名令牌的密钥和加密方法的信息。

    注意:alg 声明表示用于签名的算法 令牌,而 kid 声明表示特定的公钥 用于签署令牌。 v1.0 端点返回 x5t 和 child 声明,而 v2.0 端点仅响应 child 声明。

    这是一个 v1 令牌标头示例。在这里,您可以使用kid 的值通过OpenID Connect metadata documentjwks_uri 中找到相关的公钥(x5c)。

    然后在 jwt.io 中,将 x5c 值粘贴到公钥框中,格式为:

    格式如下:

    详情可以阅读here

    如果您想使用代码来验证令牌,有一个示例供您使用:

    public JwtSecurityToken Validate(string token)
     {
         string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
    
         ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint);
    
         OpenIdConnectConfiguration config = configManager.GetConfigurationAsync().Result;
    
         TokenValidationParameters validationParameters = new TokenValidationParameters
         {
             ValidateAudience = false,
             ValidateIssuer = false,
             IssuerSigningTokens = config.SigningTokens,
             ValidateLifetime = false
         };
    
         JwtSecurityTokenHandler tokendHandler = new JwtSecurityTokenHandler();
    
         SecurityToken jwt;
    
         var result = tokendHandler.ValidateToken(token, validationParameters, out jwt);
    
         return jwt as JwtSecurityToken;
     }

    有关代码示例的详细信息,请参阅case

    【讨论】:

    • 如果有人遇到这种情况,如果您的令牌在标头中包含 nouce 字段,则无法验证令牌的签名。 MS 希望您通过调用图形 API 来验证它。如果令牌有效,则调用将成功。否则会失败。见:github.com/AzureAD/…