AddJwtBearer()会执行我认为的吗?

我正在尝试确定是否为.net core 3.0提供了JwtBearer服务,它是否实际上使用了由oidc提供程序众所周知的配置提供的不对称签名密钥??

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

.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

相关的部分在这里:

  

如果您通过发现文档让JwtBearer中间件自动配置,那么所有这些都将自动运行!

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

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

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

yutengliqiang 回答:AddJwtBearer()会执行我认为的吗?

您不需要设置TokenValidationParameters。如果正确设置了Authority(即颁发令牌的身份验证服务器的地址),则JWT承载中间件将使用此URI查找和检索可用于验证令牌签名的公共密钥。它还将确认令牌中的iss参数与此URI匹配。中间件将帮助从OIDC元数据中获取密钥并缓存密钥。

TokenValidationParameters可以用于您想要在不访问发行服务器的情况下验证令牌的情况。相反,您想使用本地已经存在的公钥来验证传入令牌。然后,您将无法设置Authority,设置ValidateIssuerSigningKeyValidateIssuer并最终设置{{1 }},它是用于验证传入的JWT令牌的公钥。

,

查看AddJwtBearer的源代码,并根据我的实验,Authority只是您需要分配的属性。在这种情况下,处理程序将使用

MetadataAddress = $"{Authority}/.well-known/openid-configuration";

解析您的领域的元数据URL并从那里下载签名密钥。

,

我想知道的是-研究/调试显示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中间件处理程序将在内部向“ o.Authority”添加“ .well-known / openid-configuration”字符串,并尝试获取包含授权服务器详细信息的JSON。 (Google示例:https://accounts.google.com/.well-known/openid-configuration)。

下一步-获取jwks_uri(如果使用Google https://www.googleapis.com/oauth2/v3/certs)并获取jwks文件,该文件将具有用于签名验证的数据(publicKey,算法,初始向量)。 >

所有这些步骤之后,JwtBearer验证令牌签名。

仅供参考-如果您使用自己的“签名密钥”颁发者来配置令牌,JwtBearer可以未经授权地验证令牌,如下所示:

.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));
}

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

要全面了解此配置-权限和发行者密钥集:

 .AddJwtBearer(o =>{
     o.Authority = "https://authorityUri/";
     o.TokenValidationParameters.IssuerSigningKey = GetKey();
 })

在这种情况下,不会触摸权限,并且将使用本地生成的密钥来验证令牌,因此优先级为TokenValidationParameters.IssuerSigningKey。意味着没有理由添加权限。

,

您可以参考https://zhiliaxu.github.io/how-do-aspnet-core-services-validate-jwt-signature-signed-by-aad.html#configuration来了解AddJwtBearer()如何从.well-known/openid-configuration获取非对称签名密钥。

本文链接:https://www.f2er.com/3141143.html

大家都在问