AWS Cognito AccessToken против IdToken - PullRequest
       6

AWS Cognito AccessToken против IdToken

1 голос
/ 01 апреля 2020

Я создал. net Core API, используя AWS Cognito SDK для аутентификации и авторизации пользователей, публикуя учетные данные в моем API и возвращая JWT в простое приложение на стороне клиента (простой HTML / TypeScript). Запрос содержит имя пользователя и пароль.

...
var response = await cognito.AdminInitiateAuthAsync(request);

return Ok(response.AuthenticationResult.AccessToken);

против

return Ok(response.AuthenticationResult.IdToken);

Проблема, с которой я сталкиваюсь, заключается в понимании того, почему существуют токены ID и токены доступа , Я могу защитить конечные точки контроллера с помощью атрибута [Authorize]. Клиентское приложение использует заголовок авторизации с Bearer {token}.

В моих файлах Startup.cs я могу AddAuthentication и проверить подпись, эмитента, аудиторию и время жизни идентификатора токена. Однако я прочитал, что идентификатор токена содержит утверждения об идентификации пользователя, но не утверждения о группах для авторизации пользователя. Если я отправлю токен доступа своему клиенту и попытаюсь отправить его обратно в мой API, я получу несанкционированный доступ. Возможно, я не проверяю токен должным образом, но я все еще не понимаю, почему существуют два разных типа токенов. Токен доступа имеет больше смысла использовать для создания различных политик аутентификации на основе утверждений, содержащихся в токене.

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

Вот как я пытаюсь проверить токен доступа:

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;
                    },
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Authentication:Cognito:MetadataAddress"],
                    ValidateIssuer = true,
                    ValidAudience = Configuration["Authentication:Cognito:ClientId"],
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    RequireSignedTokens = true
                };
            });

В запросе aud нет токен доступа, поэтому я получаю сообщение об ошибке "Недопустимый токен, аудитория = 'пусто' недопустимо.

Даже если я удаляю ValidateAudience, я все равно получаю ошибку

1 Ответ

0 голосов
/ 02 апреля 2020

ID-токен отправляется клиентскому приложению как часть потока OpenID Connect и используется клиентом для аутентификации пользователя. Токены доступа позволяют клиентам безопасно вызывать API-интерфейсы, защищенные поставщиком удостоверений.

Идентификационный токен содержит информацию о конечном пользователе, который не используется для доступа к защищенному ресурсу, а токен доступа разрешает доступ к определенным определенным ресурсам сервера.

Чтобы при использовании OpenID Connect он возвращал ID-токен и доступ к токену обратно вашему клиенту, клиентское приложение получало информацию о пользователе из ID-токена и входило в систему, а также использовал токен доступа для доступа к защищенному ресурсу.

Если я отправлю токен доступа своему клиенту и попытаюсь отправить его обратно в мой API, я получу несанкционированный доступ.

Идентификационный токен будет проверен вашим клиентским приложением для получения заявок пользователей, поэтому audience заявка в токене является идентификатором клиента вашего клиентского приложения. Токен доступа передается на ваш защищенный ресурс (веб-API) и должен быть проверен защищенным ресурсом (веб-API), поэтому audience - это имя веб-API. Вы должны проверить параметры проверки, такие как audience, issuer.

...