我们开发了一个基于身份认证的多租户应用程序。每个用户都会获得一个存储在数据库中的令牌会话,以判断该用户是否仍处于连接状态(具有过期时间)。我将令牌(以及有关用户公司的其他信息)存储在 user 中Claim
。在 Identity 检测到用户仍然连接(或未连接)之后,我需要检查用户令牌在我们的数据库中是否仍然有效(但前提是他已连接),所以我实现了AuthorizationHandler
.
public TokenValidHandler(MyDatabaseService service)
{
// No information about the user connection string
}
protected override async void Handle(AuthorizationContext context, TokenValidRequirement requirement)
{
// Check the token in database
}
我像这样注册我的处理程序:
services.AddAuthorization(options =>
{
options.AddPolicy("TokenValid",policy => policy.Requirements.Add(new TokenValidRequirement()));
});
services.AddSingleton<IAuthorizationHandler, TokenValidHandler>();
因为我们有一个多租户应用程序,当用户退出应用程序并重新打开站点时,他的连接字符串丢失了(我们不想持久化数据库字符串),所以我使用存储的信息Claim
来恢复数据库使用权。如果身份验证过期,则 中没有可用的信息Claim
,因此我无法访问我的数据库。
如我所见,TokenValidHandler
即使用户未连接也会被实例化,这正常吗?因为在他不是的情况下,并且我想对我的数据库服务使用依赖注入,所以我不能,因为有关用户数据库访问的信息不在这里:身份没有足够快地检测到用户身份验证过期。有什么想法吗?