2017-07-07 100 views
0

因此,IResourceOwnerPasswordValidator應該取代IUserService。 在舊版本IdentityServer3我能做到以下幾點:IdentityServer4和ResourceOwnerPasswordValidator動態連接字符串

factory.UserService = new Registration<IUserService>(typeof(MyIdentityUserService)); 
factory.Register(new Registration<IUserRepository>(userRepository)); 

其通過與適當的連接字符串的自定義userRepository對象。 現在在IdentityServer4中,我需要連接到正確的Portal數據庫,以便ID4根據正確的門戶網站數據庫對用戶進行身份驗證。

如果我可以像下面那樣將一個參數傳遞給ResourceOwnerPasswordValidator類的構造函數,那麼這將很好,但這對於ASP.NET CORE是不可能的。

public ResourceOwnerPasswordValidator(string MyConnString) 
     { 
      _connstring = MyConnString; 
     } 

這不能工作,因爲ConfigurationService註冊這個類而不能傳遞值。這是有道理的,因爲這個註冊過程在管道建立之前就開始了。如何動態地將連接字符串傳遞給ResourceOwnerPasswordValidator類?我正在嘗試對打電話的門戶進行身份驗證。在ID3中,我可以通過使用acr_value來做到這一點。

我想讓ID4作爲MultiTenant身份驗證服務器進行身份驗證。

回答

0

你可以注入一個服務或DTO爲ResourceOwnerPasswordValidator構造:

public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator 
{ 
    public ResourceOwnerPasswordValidator(IAuthRepository repository) 
    { 
    } 
} 

因此,可以通過返回的連接字符串的服務。

默認情況下,驗證器的實現是registeredTransient這意味着它不會是一個單身,直到它在一個單獨解決(這不是一個IdSrv4情況下,我猜)。

如果您需要Scoped連接字符串(即每個Web請求),請使用工廠方法註冊範圍化的DTO:services.AddScoped<T>(() =>)或使用AsyncLocal<T>。檢查此線程以獲取更多詳細信息:

How to Per-Request caching in ASP.net core