Проверка токена, полученного из azure ad b2 c с использованием значений из конечной точки "jwks_uri" - PullRequest
5 голосов
/ 21 января 2020

Я получаю токен доступа к рекламе azure из служебной службы и хочу проверить его, используя некоторые стандартные параметры проверки токена, которые включают ключ подписи эмитента, аудитории и эмитента. Теперь у меня есть эмитент и аудитория, но я не не иметь ключ подписи эмитента.

Однако я извлек ключевую информацию, используя конечную точку jwks_uri azure ad b2 c, которая дает мне вывод json как

{
  "keys": [
    {
      "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4......",
      "nbf": 1493763266,
      "use": "sig",
      "kty": "RSA",
      "e": "AQAB",
      "n": "tVKUtcx_n9rt5afY_2WFNvU6PlFMggCatsZ3l4RjKxH0jgdLq6CScb0P3ZGXYbPzXvmmL...."
    }
  ]
}

Я пытался использовать только Значение n в качестве ключа, но я получаю исключение, что проверка токена не удалась Теперь я хочу узнать, как получить ключ подписи эмитента для проверки токена. Является ли n + e (конкатенация строк?) Решением? Я видел похожий вопрос Azure AD B2 C - проверка токена не работает , но она не отвечает на мой вопрос и, следовательно, хотелось бы узнать точный способ сделать это в ядре. net .

1 Ответ

2 голосов
/ 22 января 2020

Насколько я понимаю, вы хотите проверить токен доступа. Если это так, мы можем использовать SDK System.IdentityModel.Tokens для его реализации. Например

 var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
                                   "https://testb2ctenant05.b2clogin.com/testB2CTenant05.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_test",
                                    new OpenIdConnectConfigurationRetriever(), new HttpDocumentRetriever());
            CancellationToken ct = default(CancellationToken);
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            var discoveryDocument = await configurationManager.GetConfigurationAsync(ct);
            var signingKeys = discoveryDocument.SigningKeys;
            var validationParameters = new TokenValidationParameters
            {
                RequireExpirationTime = true,
                RequireSignedTokens = true,
                ValidateIssuer = true,
                ValidIssuer = discoveryDocument.Issuer,
                ValidateIssuerSigningKey = true,
                IssuerSigningKeys = signingKeys,
                ValidateLifetime = true,

            };

 var principal = new JwtSecurityTokenHandler()
            .ValidateToken(token, validationParameters, out var rawValidatedToken);
...