2011-03-21 65 views
0

我有一個實現了IAuthorizationPolicy的類。我基於擁有我所有基礎級別角色的登錄用戶(我也使用聲明完成了此操作)設置了一個自定義Principal對象。現在我想根據作爲消息參數傳入的鍵值更改特定主體的角色。通過方法改變WCF安全角色/聲明參數

我遇到的問題是請求消息無法在授權策略類中讀取,因爲我無權將消息寫回請求上下文。我可以使用CheckAccess方法的重寫複製並讀取ServiceAuthorizationManager派生類中的消息。但是,我必須確保在執行此操作之前已經調用了GetAuthorizationPolicies方法。

我在尋找關於如何根據消息是否包含特定參數來改變委託人角色的建議。基本上,當評估呼籲我想這樣做的策略方法ID:

string myObjectId = null; 

if (!messageCopy.IsEmpty) 
{ 
    System.Xml.XmlDictionaryReader xdr = messageCopy.GetReaderAtBodyContents(); 
    xdr.ReadToDecendant("objectId"); 
    if (xdr.Read()) 
    { 
     myObjectId = xdr.ReadContentAsString(); 
    } 
    xdr.Close(); 
} 
messageCopy.Close(); 

ClaimSet claims = (myObjectId != null) ? 
    MapClaims(identity, myObjectId) : MapClaims(identity); 

DefaultPrincipal principal = new DefaultPrincipal(identity, claims); 

回答

0

嘗試失敗的一整天后,我放棄了試圖讀取郵件正文和使用更簡單的方法,添加一個SOAP消息頭。當調用服務,我現在執行以下操作:

using (new OperationContextScope((IContextChannel)myService)) { 
    OperationContext.Current.OutgoingMessageHeaders.Add(
     MessageHeader.CreateHeader("objectId", "http://tempuri.org/", "object value")); 
    myService.BeginMyOperation(parm, callback, state); 
} 

然後在我的服務授權政策的評估方法,我這樣做:

int index = OperationContext.Current.IncomingMessageHeaders.FindHeader(
    "objectId", "http://tempuri.org/"); 

string myObjectId = (index < 0) ? null : 
    OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(index); 

ClaimSet claims = (myObjectId != null) ? 
    MapClaims(identity, myObjectId) : MapClaims(identity); 

DefaultPrincipal principal = new DefaultPrincipal(identity, claims); 
0

我遇到了同樣的情況,同時開發的WebAPI的安全,我choosen的下的方法:

  • 方法臨危參數創建AuthorizationContext其中它通過參數作爲資源要求
  • 我的自定義ClaimsAuthorizationManager然後可以從AuthorizationContext.Resource獲取參數並從授權中使用它。