7

所以我在 .net Core Angular 应用程序中使用 Cognito(使用 amazon-javascript-sdk),并尝试在我的 .net 核心后端验证我从亚马逊获得的 access_token,以便我可以保护我的 Web Api . 使用 Amazon cognito JWKS 我能够验证 access_token 并因此允许/拒绝访问我的 api。问题是我现在在我的 startup.cs 中硬编码了 JWK 密钥。我从 JWKS 了解到的是这些密钥可以旋转(没有找到亚马逊是否这样做)所以我想以某种方式告诉我的中间件从端点获取密钥。我阅读了有关发现文档和其他内容的内容,但找不到有关如何配置中间件以自动执行此操作的任何内容。

对于 OpenId,您可以使用 MetadataAddress 指向https://cognito-idp .{awsregion}.amazonaws.com/{userPool}/.well-known/openid-configuration,这将获得所有必要的配置。如果您使用 JwtBearer 中间件,我觉得 IssuerSigningKey(JWK) 应该存在类似的东西。我不希望设置硬编码的密钥,而是指向中间件将在其中找到密钥并发挥作用的 JWK url。JWKS 还包含多个密钥,因此我希望中间件能够自行确定要使用哪个密钥。

相关代码:

services.AddAuthentication(options =>
{
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwt =>
{
    jwt.TokenValidationParameters = new TokenValidationParameters
    {
        IssuerSigningKey = MagicFunction("hardcodedRSAModules","hardcodedRSA")
        ValidIssuer = "https://cognito-idp.us-east-2.amazonaws.com/{userpool}",
        ValidateIssuerSigningKey = true,
        ValidateIssuer = true,
        ValidateLifetime = true,
        ValidateAudience = false,
        ClockSkew = TimeSpan.FromMinutes(0)
    };
});

解决方案

对于任何有兴趣的人,在互联网上搜索更多内容后,我找到了解决方案。使用 amazon openid-configuration,可在此处获得:https://cognito-idp .{region}.amazonaws.com/{UserPoolId}/.well-known/openid-configuration 您可以使用 Configurationmanager 获取 SecurityKey。在 TokenValidationParameters 中,您可以将 IssuerSigningKeys 设置为您从配置管理器获得的密钥。这篇文章对找到解决方案也很有帮助https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide

4

0 回答 0