2010-09-15 52 views
16

我正在進行自定義WCF身份驗證和授權,並且發現了一些關於UserNamePasswordValidator的文章ServiceAuthorizationManager使用System.ServiceModel.ServiceAuthenticationManager自定義WCF身份驗證?

我還發現有關使用自定義System.ServiceModel的線索。 ServiceAuthenticationManager無效鏈接),但msdn並沒有多說這件事(http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthenticationmanager.aspx)。

所以我在這裏:任何人都知道更多關於ServiceAuthenticationManager?

一般來說,你將如何設置自定義WCF身份驗證?

+4

這很奇怪,但仍有似乎有很多的信息和樣本ServiceAuthorizationManager的,但對於ServiceAuthenticationManager – Cocowalla 2011-08-04 19:44:55

回答

35

你說得對,關於這方面的文檔根本沒有任何幫助。

我用這個班的方式如下。重寫身份驗證()方法:

  1. 出傳入消息的
  2. 拉出認證令牌(例如用戶名/密碼)驗證該令牌,並且使用它們來創建一個IPrincipal對象。這將是調用服務操作期間使用的主體。
  3. 的IPrincipal對象添加到message.Properties集合,這樣它可以在以後的WCF處理管線

你不能設置在這一點上,螺紋主要被用作它是由WCF日後發生變化。

在ServiceAuthenticationManager.Authenticate的代碼()方法會是這個樣子:

public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message) 
{ 
    int tokenPosition = message.Headers.FindHeader("Token", "http://customnamespace.org"); 
    string token = message.Headers.GetHeader<string>(tokenPosition); 

    IPrincipal user = new CustomPrincipal(token); 

    message.Properties["Principal"] = user; 

    return authPolicy; 
} 

然後添加一個自定義的授權政策

  1. 從消息檢索的IPrincipal(使用System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties集合)。
  2. 推動的IPrincipal到EvaluationContext.Properties收集
  3. 使基於所述IPrincipal.IsInRole權利要求()方法

在IAuthorizationPolicy的代碼()方法將類似於

public bool Evaluate(EvaluationContext evaluationContext, ref object state) 
{ 
    IPrincipal user = OperationContext.Current.IncomingMessageProperties["Principal"] as IPrincipal; 
    evaluationContext.Properties["Principal"] = user; 
    evaluationContext.Properties["Identities"] = new List<IIdentity> { user.Identity }; 

    IList<Claim> roleClaims = this.GetRoleClaims(user); 

    evaluationContext.AddClaimSet(this, new DefaultClaimSet(this.Issuer, roleClaims)); 

    return true; 
} 

在服務行爲配置中,您需要設置principalPermissionMode =「Custom」,以便WCF將IPrincipal設置爲實際服務操作調用的執行線程上的主體。

<serviceAuthorization principalPermissionMode="Custom"... 
+1

感謝算不上什麼,那是真正的幫助。乾杯:-) – fredlegrain 2010-10-14 11:40:51

+0

是否可以在ServiceAuthenticationManager中向ClaimSet添加身份聲明。驗證()而不是將主體放入屬性中? – 2011-09-05 22:15:22

+1

這是可能的。我認爲的預期流程是AuthenticationManager驗證憑證,並使用直接來自身份提供者的聲明(身份聲明將是其中之一),AuthorizationPolicy轉換聲明並由AuthorizationManager作出授權決定。關於這方面的文檔很少,但很難說。無論如何,現在WIF可用的模型更簡單:o) – 2011-10-11 19:25:57