Я создал. 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, я все равно получаю ошибку