2012-04-25 71 views
2

我正在爲我的WCF安全性使用自定義用戶名和密碼驗證。現在我想在請求期間存儲用戶名,以便稍後可以在被調用的方法中訪問它。我怎麼做?將數據存儲在WCF請求中的位置

一些示例代碼來描述我的問題:

public class CustomUserValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string username, string password) 
    { 
     if (username == "aaa" && password == "bbb") 
     { 
      // store username where i can get it in method called later. 
      return; 
     } 
     throw new SecurityTokenException("Unknown Username or Password"); 
    } 
} 

現在的方法被稱爲:

public void WebServiceMethod() 
{ 
    Database.User.Single(c => c.Username == /* username from above */); 
} 

BR
安德烈亞斯

+0

最簡單的方法是將它存儲在一個靜態的用戶名屬性。更好的方法是編寫一個自定義的WCF行爲。 – daryal 2012-04-25 11:55:57

+3

@daryal在每個級別上都不好; a:WCF是多線程的,b:WCF可以在不同的點使用不同的線程(使得線程靜態不可靠) – 2012-04-25 11:59:20

+0

@MarcGravell你在每個關卡都是對的:),但爲了回答這個問題,實例模式和concurreny模式。這就是爲什麼我建議寫一個行爲。 – daryal 2012-04-25 12:02:38

回答

3

您通常會通過發出這樣做自定義「主體」,通過IAuthorizationPolicy完成; IIRC,用戶名將通過評估上下文參數提供給auth-policy。 A 一般漫遊到WCF中的自定義主體是here,但是您可能需要在Evaluate中試驗一下,以在評估上下文中找到傳入的用戶名。特別是,如果任何密鑰是「索賠」字典,請看看。並在評估上下文中查看.Claims - 您應該在其發佈的CustomUserValidator中找到一個「索賠」,其中包含用戶名。

然而,我已經完成了完全是你在之前的工作中描述過 - 而且IIRC工作良好,使用上述頁面作爲我的出發點。

一旦你已經發出了本金,這將是可用的,正常的,通過:

string cn = Thread.CurrentPrincipal.Identity.Name; 
相關問題