【发布时间】:2020-07-13 10:23:01
【问题描述】:
我使用 AWS Cognito SDK 创建了一个 .net Core API,通过将凭证发布到我的 API 并将 JWT 返回到简单的客户端应用程序(纯 HTML/TypeScript)来对用户进行身份验证和授权。该请求包含用户名和密码。
...
var response = await cognito.AdminInitiateAuthAsync(request);
return Ok(response.AuthenticationResult.AccessToken);
对
return Ok(response.AuthenticationResult.IdToken);
我遇到的问题是理解为什么会有 ID 令牌和访问令牌。我可以使用 [Authorize] 属性保护控制器端点。客户端应用使用 Authorization 标头和 Bearer {token}。
在我的 Startup.cs 中,我可以AddAuthentication 并验证 ID 令牌的签名、颁发者、受众和生命周期。但是,我读到 ID 令牌包含关于用户身份的声明,但不包含关于用户授权的组的声明。如果我将访问令牌发送给我的客户并尝试将其发送回我的 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 声明,因此我收到错误消息“无效令牌,受众 = 'empty' 无效。
即使我删除了 ValidateAudience,我仍然会收到错误
【问题讨论】:
标签: api asp.net-core amazon-cognito