【问题标题】: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 document 在jwks_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/…