jwt - 如何动态设置 JwtBearerOptions?
问题描述
我正在开发一个以 asp.net core 3.1 作为后端的多租户应用程序。我使用 JWT 对用户进行身份验证。我将tenantId 与http 请求一起传递,我想根据tenantIds 验证JWT。为此,我必须在每个客户端请求时将tenantIds 传递给 JwtBearerOptions.ValidAudience。
我在启动时设置选项如下...
public void ConfigureServices(IServiceCollection services){
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(configureOptions =>
{
configureOptions.ClaimsIssuer = jwtOptions["Issuer"];
configureOptions.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = jwtOptions["Issuer"],
ValidAudience = tenantId,
ValidateIssuerSigningKey = true,
IssuerSigningKey = accessKey,
RequireExpirationTime = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});
}
请注意,我不想将所有租户 ID 传递给 ValidateAudiences,因为每个租户都应该收到一个唯一的令牌。例如,我不希望租户 X 的令牌对租户 Y 有效。
我如何实现这一目标?
提前致谢!
解决方案
我不确定为什么要将租户 ID 设置为Audience
,但您可以使用自定义受众验证器来实现以下逻辑TokenValidationParameters
:
AudienceValidator = (audiences, securityToken, validationParameters) =>
{
//return true/false based on your requirement
return true;
},
推荐阅读
- python - 是否可以将 HyperDriveStep 与时间序列交叉验证一起使用?
- python - 使用正则表达式忽略不完整的数据集?
- java - 如何为我要进行基准测试的函数提供随机输入?
- php - 无法连接到 gmail-imap.l.google.com,993:连接被拒绝
- python - 为什么当用户按下按钮时我的 Tkinter GUI 会冻结(仅当我使用线程时)?
- reactjs - 如何在 React-Redux 应用程序中修复 431 请求标头字段太大
- crash - .Net 进程的自动故障转储
- git - 如何关闭 GIT 凭据管理器
- cassandra - DSE 集群节点磁盘被填满
- linux - 如何避免在 Linux 上创建 tmp-Files?