你說得對,關於這方面的文檔根本沒有任何幫助。
我用這個班的方式如下。重寫身份驗證()方法:
- 出傳入消息的
- 拉出認證令牌(例如用戶名/密碼)驗證該令牌,並且使用它們來創建一個IPrincipal對象。這將是調用服務操作期間使用的主體。
- 的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;
}
然後添加一個自定義的授權政策
- 從消息檢索的IPrincipal(使用System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties集合)。
- 推動的IPrincipal到EvaluationContext.Properties收集
- 使基於所述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"...
這很奇怪,但仍有似乎有很多的信息和樣本ServiceAuthorizationManager的,但對於ServiceAuthenticationManager – Cocowalla 2011-08-04 19:44:55