首页 > 解决方案 > 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,我仍然会收到错误消息

标签: apiasp.net-coreamazon-cognito

解决方案


ID 令牌作为 OpenID Connect 流的一部分发送到客户端应用程序,并由客户端用于对用户进行身份验证。访问令牌使客户端能够安全地调用受身份提供者保护的 API。

ID 令牌包含有关不用于访问受保护资源的最终用户的信息,而访问令牌允许访问某些已定义的服务器资源。

这样在使用 OpenID Connect 时,它会将 ID 令牌和访问令牌返回给您的客户端,客户端应用程序将从 id 令牌获取用户信息并登录用户,并使用访问令牌访问受保护的资源。

如果我将访问令牌发送给我的客户并尝试将其发送回我的 API,我将获得未经授权。

ID 令牌将由您的客户端应用程序验证以获取用户声明,因此audience令牌中的声明是您的客户端应用程序的客户端 ID。访问令牌被传递给您的受保护资源(web api),并应由受保护资源(web api)验证,因此audience是 web api 的名称。您应该检查验证选项,如audience, issuer


推荐阅读