我有.net核心Web API,该API在公司Intranet A 中的计算机上运行,并且无法访问Internet。
然后我在intranet B 中拥有一个网站,该网站已在Azure AD中进行了身份验证。
我想使用标题Authentication: JwtTokenFromAzure
将请求从 B 发送到 A 。
验证此令牌的最佳选择是什么?
答案 0 :(得分:3)
要验证id_token或access_token,您的应用程序应同时验证令牌的签名和声明。 您可以使用jwt.io手动验证令牌,也可以使用代码。
要手动验证令牌,应首先验证令牌的签名。 Azure AD发行的令牌使用行业标准的非对称加密算法进行签名,JWT的标头包含有关用于签名令牌的密钥和加密方法的信息。
注意:
alg
声明指出了用于签署 令牌,而kid
声明指出了 用于签署令牌。 v1.0端点同时返回x5t和 小子声称,而v2.0端点仅以小子声明回应。
这是v1令牌标头示例。在这里,您可以使用kid
值通过使用jwks_uri在OpenID Connect metadata document中找到相关的公钥(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。