我们基于身份验证开发了一个多租户应用程序。每个用户获得存储在数据库中的令牌会话,以告知用户是否仍然连接(具有到期时间)。我将令牌(以及有关用户公司的其他信息)存储在用户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>();
因为我们有一个多租户应用程序,当用户退出应用程序并重新打开该站点时,他的连接字符串将丢失(我们不想保留数据库字符串),所以我使用存储在{的信息{1}}恢复数据库访问权限。如果身份验证过期,Claim
中没有可用的信息,那么我无法访问我的数据库。
正如我所看到的,即使用户未连接,Claim
也会被实例化,这是正常的吗?因为在他没有的情况下,我想对我的数据库服务使用依赖注入,我不能,因为有关用户数据库访问的信息不在这里:身份没有及时检测到用户身份验证已过期。有关于此的任何想法吗?
答案 0 :(得分:5)
尝试将处理程序注册为作用域,并且您将获得每个请求的新实例,这可能是您想要的。