我們基於身份驗證開發多租戶應用程序。每個用戶都會獲得一個存儲在數據庫中的令牌會話,以告知用戶是否仍處於連接狀態(過期時間)。我在用戶Claim
中存儲令牌(以及有關用戶公司的其他信息)。在身份檢測到用戶仍然連接(或沒有)之後,我需要檢查用戶令牌在我們的數據庫中是否仍然有效(但只有當他連接時),所以我實現了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
也是即時的,這是正常的嗎?因爲在他不是的情況下,我想爲我的數據庫服務使用依賴注入,所以我不能這樣做,因爲有關用戶數據庫訪問的信息不在這裏:身份檢測不夠快,導致用戶身份驗證失效。有關於此的任何想法?
我發現現在使用IServiceProvider的解決方案,所以我得到我的數據庫服務進入處理程序方法,而不是通過依賴注入,不是很乾淨的解決方案... –