asp.net-core - AddJwtBearer() 是否按照我的想法行事?

标签 asp.net-core .net-core keycloak

我正在尝试确定是否为 .net core 3.0 提供了 JwtBearer 服务,它是否真的使用了由我的 oidc 提供商众所周知的配置提供的非对称签名 key ????

我找不到任何关于此的文档。

.AddJwtBearer(opt =>
                    {
                        opt.Authority = "http://localhost:8180/auth/realms/master";
                        opt.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                        {
                            ValidateIssuer = true,
                            ValidateAudience = false,
                            ValidateLifetime = true,
                            ValidateIssuerSigningKey = true
                        };

我使用 Keycloak 4.8.3 作为我的 oidc 提供程序。我能找到的最接近的文档在这里。 https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide

相关部分在这里:

If you let the JwtBearer middleware auto-configure via the discovery document, this all works automatically!



上面的代码做了所有这些吗?由于我们不再注册中间件,这在 3.0 中仍然相关吗?

我敢打赌,很多人不知道非对称签名 key ,也不知道为什么它们如此重要。我们已经从开发人员那里抽象了很多东西,现在我什至不知道我的 api 是否安全。

所以最后一个问题是。 Does the .AddJwtBearer service with "ValidateIssuerSigningKey" periodically check the wellknown or whatever discovery document to grab the latest asymettric signing key?

最佳答案

我想知道同样的 - 研究/调试表明 JwtBearer 确实试图联系权威以获取公钥。

这是验证期间调用的函数:

// System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.cs

protected virtual SecurityKey ResolveIssuerSigningKey(string token, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
            {
                if (validationParameters == null)
                    throw LogHelper.LogArgumentNullException(nameof(validationParameters));

                if (jwtToken == null)
                    throw LogHelper.LogArgumentNullException(nameof(jwtToken));

                return JwtTokenUtilities.FindKeyMatch(jwtToken.Header.Kid, jwtToken.Header.X5t, validationParameters.IssuerSigningKey, validationParameters.IssuerSigningKeys);
            }

显然,只有当您在配置中设置 Oauth 权限时,才会调用此联系公钥权限的逻辑:
 .AddJwtBearer(o =>{
     o.Authority = "https://authorityUri/";
 })

AddJwtBearer 中间件处理程序在内部将“.well-known/openid-configuration”字符串添加到 o.Authority 并尝试获取带有授权服务器详细信息的 JSON。 (谷歌示例:https://accounts.google.com/.well-known/openid-configuration)。

下一步 - 获取 jwks_uri ,(在 google https://www.googleapis.com/oauth2/v3/certs 的情况下)并获取 jwks 文件,该文件将包含用于签名验证的数据(公钥、算法、初始向量)。

在所有这些步骤之后,JwtBearer 验证 token 签名。

仅供引用 - 如果您使用自己的签名 key 颁发者对其进行配置,JwtBearer 可以在没有权限的情况下验证 token ,如下所示:
.AddJwtBearer(o =>{
         o.TokenValidationParameters.IssuerSigningKey = GetKey();
         //in this case you need to provide valid audience or disable validation
         o.TokenValidationParameters.ValidateAudience = false
         //in this case you need to provide valid issuer or disable validation
         o.TokenValidationParameters.ValidateIssuer= false
     })

Microsoft.IdentityModel.Tokens.SecurityKey = GetKey(){
            var key = "Secret_Pass";
            return new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
}

在这种情况下,您需要提供发行者和受众或禁用验证。
此配置可用于 B2B 案例 - 服务器到服务器的通信 - 当您没有 Oauth 服务器并使用共享 key 自己发布 token 时。

有关完整图片,请查看此配置 - 权限和颁发者 key 集:
 .AddJwtBearer(o =>{
     o.Authority = "https://authorityUri/";
     o.TokenValidationParameters.IssuerSigningKey = GetKey();
 })

在这种情况下,不会触及权限,并且您本地生成的 key 将用于验证 token ,因此优先级是 TokenValidationParameters.IssuerSigningKey。意味着没有理由添加权限。

关于asp.net-core - AddJwtBearer() 是否按照我的想法行事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58758198/

相关文章:

c# - ASP.NET Core WebAPI 在返回集合时是否不支持延迟执行/延迟评估?

asp.net-core - 在 .Net Core Alpine 容器中使用 ServiceStack 解压缩请求

freemarker - Keycloak在注册屏幕上删除名字和姓氏字段

spring-boot - 使用 keycloak - JWT token 保护 Spring Boot 服务

c# - IdentityServer4 token 签名验证

asp.net-core - Swashbuckle aspnet core 2.0 Swaggerconfig.cs 未创建

asp.net-core - CKEDITOR 文件上传错误请求 400 错误

javascript - Kendo UI - 将参数传递给 read().data() 中的 JS 函数

c# - 在锁定中使用异步方法的最佳实践是什么

keycloak - 无法通过 Admin REST API 将领域角色分配给新创建的 Keycloak 用户