Как проверить AWS Cognito JWT в .NET Core Web API с помощью .AddJwtBearer () - PullRequest
0 голосов
/ 11 ноября 2018

У меня возникли проблемы с выяснением того, как выполнить проверку JWT, предоставленную клиенту AWS Cognito в моем .NET Core Web API.

Я не только не мог понять, какими должны быть переменные для Microsoft.IdentityModel.Tokens.TokenValidationParameters, но когда я наконец это сделал, я не знал, как получить набор ключей JWT из https://cognito-idp.{region}.amazonaws.com/{pool ID}/.well-known/jwks.json

Наконец, несмотря на большое количество случайных поисков и проб и ошибок, я нашел решение (казалось бы, не очень эффективное). Однако я потратил слишком много времени на это. Ссылаясь на это, а также на то, что документации AWS по этому вопросу крайне не хватает, я решил опубликовать эти вопросы и ответы, чтобы помочь другим в будущем легче найти это решение.

Если есть лучший способ сделать это, кто-то , пожалуйста, , скажите мне, потому что я еще не нашел способ сделать это, кроме моего ответа, перечисленного ниже.

1 Ответ

0 голосов
/ 11 ноября 2018

Ответ заключается, прежде всего, в правильном определении TokenValidationParameters.IssuerSigningKeyResolver (параметров и т. Д., Показанных здесь: https://docs.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.tokens.issuersigningkeyresolver?view=azure-dotnet).

. Это то, что говорит .NET Core, что проверять отправку JWT. Нужно также сказатьэто где найти список ключей. Не обязательно жестко закодировать набор ключей, так как он часто поворачивается AWS.

Один из способов сделать это - извлечь и сериализовать список из URL-адреса внутриметод IssuerSigningKeyResolver. Весь .AddJwtBearer() может выглядеть примерно так:

Startup.cs Метод ConfigureServices ():

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        IssuerSigningKeyResolver = (s, securityToken, identifier, parameters) =>
                        {
                            // get JsonWebKeySet from AWS
                            var json = new WebClient().DownloadString(parameters.ValidIssuer + "/.well-known/jwks.json");
                            // serialize the result
                            var keys = JsonConvert.DeserializeObject<JsonWebKeySet>(json).Keys;
                            // cast the result to be the type expected by IssuerSigningKeyResolver
                            return (IEnumerable<SecurityKey>)keys;
                        },

                        ValidIssuer = "https://cognito-idp.{region}.amazonaws.com/{pool ID}",
                        ValidateIssuerSigningKey = true,
                        ValidateIssuer = true,
                        ValidateLifetime = true,
                        ValidAudience = "{Cognito AppClientID}",
                        ValidateAudience = true
                    };
                });

Если вы используетеВ библиотеке JS, такой как AWS Amplify, вы можете видеть такие параметры, как ValidIssuer и ValidAudience в консоли вашего браузера, наблюдая за результатом Auth.currentSession()

запроса выборки REST от клиента JS к a.NET Core Web API с использованием аутентификации JWT, достигнутой выше, а также с использованием тега [Authorize] на вашем контроллере может выглядеть примерно так:

JS-клиент, использующий пакет узла @ aws-ampify / auth:

// get the current logged in user's info
Auth.currentSession().then((user) => {
fetch('https://localhost:5001/api/values',
  {
    method: 'GET',
    headers: {
      // get the user's JWT token given to it by AWS cognito 
      'Authorization': `Bearer ${user.getIdToken().getJwtToken()}`,
      'Content-Type': 'application/json'
    }
  }
).then(response => response.json())
 .then(data => console.log(data))
 .catch(e => console.error(e))
})
...