api - AWS Cognito AccessToken 与 IdToken
问题描述
我使用 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,我仍然会收到错误消息
解决方案
ID 令牌作为 OpenID Connect 流的一部分发送到客户端应用程序,并由客户端用于对用户进行身份验证。访问令牌使客户端能够安全地调用受身份提供者保护的 API。
ID 令牌包含有关不用于访问受保护资源的最终用户的信息,而访问令牌允许访问某些已定义的服务器资源。
这样在使用 OpenID Connect 时,它会将 ID 令牌和访问令牌返回给您的客户端,客户端应用程序将从 id 令牌获取用户信息并登录用户,并使用访问令牌访问受保护的资源。
如果我将访问令牌发送给我的客户并尝试将其发送回我的 API,我将获得未经授权。
ID 令牌将由您的客户端应用程序验证以获取用户声明,因此audience
令牌中的声明是您的客户端应用程序的客户端 ID。访问令牌被传递给您的受保护资源(web api),并应由受保护资源(web api)验证,因此audience
是 web api 的名称。您应该检查验证选项,如audience
, issuer
。
推荐阅读
- html - 填充语句过渡与背景和图像和文本?[解决了]
- powershell - 处于关闭状态的 ComboBox 的鼠标事件处理程序
- sql - 将列名动态插入函数
- php - 使用自定义管理员访问后删除的 wordpress 页面
- julia - 我怎么能不改变矩阵
- python - 使用 Python Pandas 根据条件突出显示数据并将其写回相同的 .xls 文件
- javascript - setInterval(callback, ms) 在控制台工作,但不操作 DOM,为什么?
- xpath - 如何在 Telegram 的即时视图中添加图像?
- c - 如何在С中读取或写入64位数字?
- c# - 将多个文本框限制为数字