Amazon Cognito发行访问令牌时,它不包含aud
字段。
在documentation for Cognito tokens中,为aud
字段列出了ID令牌(始终设置为与client_id
相同的值),但没有列出访问令牌。
relevant section of the JWT specification说:
如果提出该要求的委托人未在“ aud”声明中使用某个值标识自身,则必须拒绝JWT。
那么,这是怎么回事。谁是对的?这是安全问题吗?
我注意到令牌的iss
部分专门针对我的用户池,由于它是由Amazon签名的,因此不能被篡改,所以我认为我应该很安全
OAuth 2和JWT非常令人困惑,所以我想征询更多意见。
答案 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;
});