【问题标题】:AWS Cognito AccessToken vs IdTokenAWS Cognito AccessToken 与 IdToken
【发布时间】: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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这是有道理的,但是,来自 AWS 的访问令牌不包含 'aud' 声明,我收到一个错误 "Bearer error="invalid_token", error_description="The Audience 'empty'无效"" 即使我省略了 ValidateAudience 我仍然会收到此错误
    • @Shawn 只要确保 ValidateAudience 设置为 false:``` options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false }; ```
    猜你喜欢
    • 2018-01-14
    • 2021-10-21
    • 2017-05-13
    • 2017-10-21
    • 2017-09-01
    • 1970-01-01
    • 2020-05-18
    • 2022-12-20
    • 1970-01-01
    相关资源
    最近更新 更多