gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:59:29 24 4
gpt4 key购买 nike

我正在尝试确定是否为 .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/

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