Azure AD Jwt令牌验证没有互联网

时间:2018-12-12 15:19:46

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


我有.net核心Web API,该API在公司Intranet A 中的计算机上运行,​​并且无法访问Internet。
然后我在intranet B 中拥有一个网站,该网站已在Azure AD中进行了身份验证。
我想使用标题Authentication: JwtTokenFromAzure将请求从 B 发送到 A
验证此令牌的最佳选择是什么?

1 个答案:

答案 0 :(得分:3)

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

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

enter image description here

  

注意:alg声明指出了用于签署   令牌,而kid声明指出了   用于签署令牌。 v1.0端点同时返回x5t和   小子声称,而v2.0端点仅以小子声明回应。

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

enter image description here

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

enter image description here

以及类似这样的格式: enter image description here

有关详细信息,您可以阅读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