AuthorizationHandler 和数据库依赖注入

Posted

技术标签:

【中文标题】AuthorizationHandler 和数据库依赖注入【英文标题】:AuthorizationHandler and database dependency injection 【发布时间】:2016-08-22 22:10:12 【问题描述】:

我们开发了一个基于身份验证的多租户应用程序。每个用户都会获得一个存储在数据库中的令牌会话,以判断用户是否仍处于连接状态(具有过期时间)。我将令牌(以及有关用户公司的其他信息)存储在用户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>();

因为我们有一个多租户应用程序,当用户退出应用程序并重新打开站点时,他的连接字符串丢失了(我们不想持久化数据库字符串),所以我使用存储在@中的信息987654325@ 恢复数据库访问。如果验证过期,Claim 中没有可用的信息,所以我无法访问我的数据库。

如我所见,TokenValidHandler 即使用户未连接也会被实例化,这正常吗?因为在他不是的情况下,并且我想对我的数据库服务使用依赖注入,我不能因为有关用户数据库访问的信息不在这里:身份检测不够快以至于用户身份验证过期。有什么想法吗?

【问题讨论】:

我暂时找到了使用 IServiceProvider 的解决方案,所以我将我的数据库服务放入 Handler 方法中,而不是通过依赖注入,不是那么干净的解决方案... 【参考方案1】:

尝试将您的处理程序注册为范围,您将获得每个请求的新实例,这可能是您想要的。

【讨论】:

是的,但是如果我有 5000 个注册为作用域的处理程序,为什么在我交互任何操作时都实例化它们?它们可能依赖于应该注入的其他服务。

以上是关于AuthorizationHandler 和数据库依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

AuthorizationHandler异常不通过ExceptionFilter

来自 AuthorizationHandler (ASP.NET Core) 的自定义重定向

自定义AuthorizationHandler HandleRequirementAsync未调用

有没有办法在 .Net 5 中的 AuthorizationHandler 中重定向?

.NET7之MiniAPI(特别篇) :Preview5优化了JWT验证(下)

[Asp.Net Core]NET5策略鉴权