2015-12-18 99 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/

有这个想法