2009-12-11 45 views
3

我有一個WCF服務,我使用customUserNamePasswordValidatorType(在web.config文件的behaviors \ serviceBehaviors \ serviceCredentials \ userNameAuthentication部分中指定)。如何在WCF中存儲有關經過身份驗證的用戶的信息?

我定製UserNamePasswordValidator這樣工作:

public bool Authenticate(string userName, string password) 
{ 
    If (IsUserValid(username, password)) 
    { 
     UserInfo currentUser = CreateUserInfo(username); 
     // 
     // Here I'd like to store the currentUser object somewhere so that 
     // it can be used during the service method execution 
     // 
     return true; 
    } 
    return false; 

}

在服務調用執行,我需要訪問身份驗證的用戶的信息。比如我想能夠實現:

public class MyService : IService 
{ 
    public string Service1() 
    { 
     // 
     // Here I'd like to retrieve the currentUser object and use it 
     // 
     return "Hello" + currentUser.Name; 
    } 
} 

我的問題是如何以及在何處,我應該在驗證過程中存儲的信息,以便它可以在執行呼叫進程訪問?只要「會話」有效,該存儲應該只會持續。

順便說一下,我不使用(也不想使用)安全會話和/或可靠會話。所以我既建立了安全關係上下文,也關閉了可靠的關係。

我在考慮啓用ASP.NET兼容模式來將用戶信息存儲在HttpContext.Current.Session中,但我感覺這不是應該如何完成的。

回答

2

將需要保存的任何內容存儲到持久性存儲中 - 例如,一個數據庫,這是最好的方法。

將用戶信息存儲在用戶表中,例如, ASP.NET會員系統或您自己的東西。在手頭保存某種識別標記(用戶名,ID等),以便在需要時從數據庫中檢索該信息。

你應該努力盡可能擁有無狀態的WCF服務 - 它不應該依賴於除安全存儲在數據庫中的任何其他類型的「狀態」。

+0

好的,但在服務執行期間,我將如何檢索當前用戶的用戶名,以便我可以在數據庫中查找它? – Sylvain

+3

您應該可以在每次服務調用中檢查「ServiceSecurityContext.Current.PrimaryIdentity」。這應該包含當前已通過身份驗證的用戶的IIdentity –

+0

該主要身份具有「Name」屬性,該屬性應該是當前通過身份驗證的用戶的用戶名;將其用作數據庫表中更多用戶信息的「入口點」 –

相關問題