Ответ заключается, прежде всего, в правильном определении 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))
})