c# - 验证多租户 .Net Core Web API 应用程序的颁发者的适当位置
问题描述
我正在开发一个多租户 SPA 应用程序,它为数据调用后端 .Net Core Web API。前端 UI 将使用 MSAL 和 Microsoft 的 v2 通用端点针对 AAD 对用户进行身份验证并获取 id 和访问令牌。
在我的 Web API 中,我想验证颁发者,但如此处所述,使用公共端点提供的元数据使正常的颁发者验证无法使用。
我已经看到对几个可以覆盖或自定义令牌验证的地方的引用,但我不确定哪个是首选,或者这些方法中的任何一个是否会导致不希望的副作用。
一种方法使用 JwtBearer 选项的事件:options.Events.TokenValidated
另一种方法使用 TokenValidationParameters 的IssuerValidator
委托。
除了确保发行者存在于我的已验证发行者数据库中之外,我不想编写任何令牌验证逻辑。这个逻辑应该放在IssuerValidator
or中TokenValidated
吗?
我当前的代码如下所示(当前为单租户设置)
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://myauthority.com";
options.Audience = "https://myaudience.com/api/v1";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "myauthority.com",
ValidateAudience = true,
ValidAudience = "https://myaudience.com",
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
};
});
我在 using 中看到的一个问题IssuerValidator
是,似乎没有一种方法可以注入或传递对能够在数据库中查找租户 ID 所需的 dbContext 的引用。
有没有人解决过这个问题或做过类似的事情?
解决方案
您可以检查一下OnTokenValidated
,以访问数据库上下文,您可以尝试:
options.Events.OnTokenValidated = async (context) =>
{
var dbContext = context.HttpContext.RequestServices.GetRequiredService<BloggingContext>();
var blogs = await dbContext.Blogs.ToListAsync();
if (!true)
{
throw new SecurityTokenValidationException($"Tenant xxxxx is not registered");
}
};
推荐阅读
- angular - Angular2如何从.toPromise()获取数组数据
- java - 找不到符号 intellij gradle
- python - 无法终止 python 程序
- git - git如何在远程和本地保留文件,但永远不要跟踪该文件的修改
- python - Python,在多个目录中一个一个删除文件
- java - 尽管程序一次扫描一个元素,但程序仍在无限地接受输入
- cumulative-sum - PowerBI年内(财政年度)按月累计
- arrays - 为什么我的数组中的原始项目被 Object.assign 覆盖?
- angularjs - Elastic Beanstalk:从 SPA 中删除 hashbang url
- javascript - 如何使用 CSS 进行单基索引?