Amazon Cognito为什么不在其访问令牌中返回受众字段?

时间:2018-11-05 05:16:36

标签: amazon-web-services oauth-2.0 jwt amazon-cognito

Amazon Cognito发行访问令牌时,它不包含aud字段。

documentation for Cognito tokens中,为aud字段列出了ID令牌(始终设置为与client_id相同的值),但没有列出访问令牌。

relevant section of the JWT specification说:

  

如果提出该要求的委托人未在“ aud”声明中使用某个值标识自身,则必须拒绝JWT。

那么,这是怎么回事。谁是对的?这是安全问题吗?

我注意到令牌的iss部分专门针对我的用户池,由于它是由Amazon签名的,因此不能被篡改,所以我认为我应该很安全

OAuth 2和JWT非常令人困惑,所以我想征询更多意见。

3 个答案:

答案 0 :(得分:2)

从我对RFC的阅读中,我认为AWS并没有做错任何事情,特别是(请注意我的重点):

  

如果处理该声明的委托人未使用“ aud”声明中的值来标识自己存在该声明,则必须拒绝JWT。

     

对此声明的使用是可选

我相信,这意味着AWS很好,因为在访问令牌的情况下它只是省略了声明,但是它通过设置 来标识自身(以自己的方式)确实对ID令牌提出索赔时将其移至client_id

应该注意,访问令牌本身确实对受众进行编码和执行;这样,当您针对AWS的API进行操作时,它将强制您仅接收为其发出的client_id / scope上的可用资源。

答案 1 :(得分:1)

现在看来,AWS Cognito包含对访问令牌的client_id声明。我没有在任何AWS文档中找到它,我唯一能找到的就是这个GitHub问题:https://github.com/ghdna/cognito-express/issues/11

答案 2 :(得分:0)

许多dotnet Web应用程序认知教程都基于以下错误假设:在以下设置中,客户端ID将是受众群体ID,而不起作用

          services
          .AddAuthentication(options => {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options => 
            {
                options.Audience = "Client ID";
                options.Authority = "https://cognito-idp.ap-southeast-2.amazonaws.com/USERPOOLID";
                options.RequireHttpsMetadata = false;

            });

一种临时的解决方法是不验证受众:

services
            .AddAuthentication(options => {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options => 
            {
                // AWS cognito jwt token does not have aud included so that we cannot validate audience.
                // options.Audience = "Client ID";
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateAudience = false
                };
                options.Authority = "https://cognito-idp.ap-southeast-2.amazonaws.com/USERPOOLID";
                options.RequireHttpsMetadata = false;

            });