2010-09-07 80 views
1

今天,我爲我的WCF服務實現了一個自定義身份驗證提供程序。它可以確定我的用戶是否有效,就像預期的一樣。在WCF服務中檢索當前已通過身份驗證的用戶

所以,現在我有這個類:

public class MyCustomValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string userName, string password) 
    { 
     User apiUser = User.Login(userName, password); 

     // other logic goes here. 
    } 
} 

我的應用程序的行爲取決於用戶可以訪問哪些對象。那麼,我怎樣才能讓我的用戶對象從這裏到我的服務類?我沒有看到明顯的方式,因爲我的服務類不像ASP.NET控制器那樣默認從任何東西繼承。

我的第一本能是在MyCustomValidator中設置一個靜態參數,然後從那裏讀取它,但我懷疑可能發生競態條件。任何人都可以證實或否認我的懷疑嗎?

最重要的是:有沒有更好的方法來做到這一點?這是我第一次使用WCF,所以我不知道這裏涉及的最佳實踐。

謝謝你的時間。

+1

您的驗證肯定是錯誤的,因爲它需要訪問用戶的明文密碼。絕大多數身份驗證方案(摘要,NTLM,Kerberos,OAuth)從不以明文形式傳遞密碼,他們通過挑戰和摘要響應(即通過哈希)建立密碼所有權。 – 2010-09-07 17:11:35

回答

1

您希望將驗證器中的某些數據傳遞給服務實例。這是不好的,因爲你不能這樣做。 UserNamePasswordValidator僅用於驗證憑據(用戶名和密碼)。您無權訪問驗證器中的任何內容。它甚至不會看到當前的操作上下文,因爲它運行在不同的線程中。使用靜態參數不是一個懶惰 - 正如你所說,它是競態條件。

我認爲你需要實現自定義的身份驗證和授權,這是不容易的: WCF AuthorizatonCustom AuthorizationCustom credentials and validation

+0

非常感謝您使用這些關鍵字。我相信我現在正在解決這個問題的正確軌道。我希望今天晚些時候完全回答這個問題,我會在這裏發表我的迴應。 – 2010-09-08 08:30:33