1

我們基於身份驗證開發多租戶應用程序。每個用戶都會獲得一個存儲在數據庫中的令牌會話,以告知用戶是否仍處於連接狀態(過期時間)。我在用戶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也是即時的,這是正常的嗎?因爲在他不是的情況下,我想爲我的數據庫服務使用依賴注入,所以我不能這樣做,因爲有關用戶數據庫訪問的信息不在這裏:身份檢測不夠快,導致用戶身份驗證失效。有關於此的任何想法?

+0

我發現現在使用IServiceProvider的解決方案,所以我得到我的數據庫服務進入處理程序方法,而不是通過依賴注入,不是很乾淨的解決方案... –

回答

2

嘗試註冊您的處理程序作爲範圍,並且您將得到一個新的實例每個請求,這可能是你想要的。

+0

是的,你是對的,這是我們找到的解決方案;) –

+0

這是真的,但如果我有5000個處理程序註冊爲作用域,爲什麼當我交互任何操作時,它們都會實例化?他們可能依賴於應該注入的其他服務。 –