gpt4 book ai didi

.net-core - 如何使用 .AddJwtBearer() 在 .NET Core Web API 中验证 AWS Cognito JWT

转载 作者:行者123 更新时间:2023-12-04 15:40:05 24 4
gpt4 key购买 nike

我在弄清楚如何验证 AWS Cognito 在我的 .NET Core Web API 中提供给客户端的 JWT 时遇到了一些麻烦。

我不仅无法弄清楚 Microsoft.IdentityModel.Tokens.TokenValidationParameters 的变量是什么应该是,但是一旦我终于做到了,我不知道如何从 https://cognito-idp.{region}.amazonaws.com/{pool ID}/.well-known/jwks.json 检索 JWT key 集

最后,尽管进行了大量的随机谷歌搜索和反复试验,但我找到了一个(看似不是非常有效的解决方案)解决方案。然而,我花了太多时间做这件事。考虑到这一点,再加上 AWS 严重缺乏有关该主题的文档,我决定发布此问答,以帮助其他人将来更轻松地找到此解决方案。

如果有更好的方法来做到这一点,请有人告诉我,因为除了下面列出的答案之外,我还没有找到一种方法来做到这一点。

最佳答案

答案主要在于正确定义 TokenValidationParameters.IssuerSigningKeyResolver (参数等在这里看到: https://docs.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.tokens.issuersigningkeyresolver?view=azure-dotnet )。

这就是告诉 .NET Core 验证发送的 JWT 所针对的内容。还必须告诉它在哪里可以找到键列表。不一定要对 key 集进行硬编码,因为它通常由 AWS 轮换。

一种方法是从 IssuerSigningKeyResolver 中的 URL 中获取并序列化列表。方法。整机.AddJwtBearer()可能看起来像这样:

Startup.cs ConfigureServices() 方法:

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;
},

ValidIssuer = "https://cognito-idp.{region}.amazonaws.com/{pool ID}",
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateLifetime = true,
ValidAudience = "{Cognito AppClientID}",
ValidateAudience = true
};
});

如果使用AWS Amplify等JS库,可以看到 ValidIssuer等参数和 ValidAudience在浏览器的控制台中观察 Auth.currentSession() 的结果

利用上面实现的 JWT 身份验证以及使用 [Authorize] 从 JS 客户端到 .NET Core Web API 的 REST 获取请求 Controller 上的标签可能如下所示:

使用 @aws-amplify/auth 节点包的 JS 客户端:
// get the current logged in user's info
Auth.currentSession().then((user) => {
fetch('https://localhost:5001/api/values',
{
method: 'GET',
headers: {
// get the user's JWT token given to it by AWS cognito
'Authorization': `Bearer ${user.signInUserSession.accessToken.jwtToken}`,
'Content-Type': 'application/json'
}
}
).then(response => response.json())
.then(data => console.log(data))
.catch(e => console.error(e))
})

关于.net-core - 如何使用 .AddJwtBearer() 在 .NET Core Web API 中验证 AWS Cognito JWT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53244446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com