2015-12-18 127 views
0

我有一個充當WCF客戶端的ASP.NET MVC/WebApi應用程序。如果當前用戶和數據的組合不匹配(例如,用戶嘗試訪問其他用戶的數據),我的WCF服務正在通過ClaimsPrincipalPermission進行授權,另外還會拋出SecurityException通過多次WCF服務傳遞SecurityException

我趕上這在我的過濾器SecurityAccessDeniedException和返回狀態碼403

但是,這僅適用於涉及單跳通信。如果服務本身與另一項服務進行通信,則SecurityAccessDeniedException在到達Web應用程序之前變爲FaultException

示例流程:

Web client --> Service A [SecurityException] --> [SecurityAccessDeniedException] Web 

Web client --> Service A --> Service B [SecurityException] 
    --> [SecurityAccessDeniedException] Service A [FaultException] --> [FaultException] Web 

我試圖實現一個IErrorHandler處理該SecurityAccessDeniedException但我不能只是拋出一個SecurityException那裏。

我有什麼選擇將SecurityException傳播到Web客戶端?

或者:我如何在我的錯誤處理程序中構造一條消息,然後客戶端正確地將其解釋爲SecurityAccessDeniedException

回答

0

我現在使用的是IErrorHandler,它會生成相應的FaultException。在主叫方,這會產生另一個SecurityAccessDeniedException,我會再與同一IErrorHandler

public void ProvideFault(Exception error, MessageVersion version, ref Message message) 
{ 
    if (error is SecurityAccessDeniedException) 
    { 
     var code = FaultCode.CreateSenderFaultCode(
      "FailedAuthentication", 
      "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 

     var faultText = new FaultReasonText(error.Message, CultureInfo.CurrentCulture); 

     var faultException = new FaultException(new FaultReason(faultText), code); 
     MessageFault messageFault = faultException.CreateMessageFault(); 
     message = Message.CreateMessage(version, messageFault, "FailedAuthentication"); // the last parameter might not be semantically correct... 
    } 
} 

處理我通過看http://leastprivilege.com/2007/11/01/wcf-and-securityaccessdeniedexception/

有這個想法