Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过WCF服务的多个跃点传递SecurityException_C#_Wcf_Exception_Authorization - Fatal编程技术网

C# 通过WCF服务的多个跃点传递SecurityException

C# 通过WCF服务的多个跃点传递SecurityException,c#,wcf,exception,authorization,C#,Wcf,Exception,Authorization,我有一个ASP.NETMVC/WebApi应用程序作为WCF客户端。我的WCF服务正在通过ClaimsPrincipalPermission进行授权,如果当前用户和数据的组合不匹配(例如,用户试图从其他用户访问数据),则会另外抛出SecurityException 在我的过滤器中,我将其视为一个SecurityAccessDeniedException,并返回状态代码403 但是,这仅适用于涉及单跳的通信。如果服务本身与另一个服务通信,则SecurityAccessDeniedException

我有一个ASP.NETMVC/WebApi应用程序作为WCF客户端。我的WCF服务正在通过
ClaimsPrincipalPermission
进行授权,如果当前用户和数据的组合不匹配(例如,用户试图从其他用户访问数据),则会另外抛出
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
我尝试实现一个处理
SecurityAccessDeniedException
IErrorHandler
,但我不能在那里抛出一个
SecurityException

SecurityException
传播到Web客户端的选项有哪些


或者:如何在错误处理程序中构造一条消息,然后客户端将其正确解释为
SecurityAccessDeniedException

我现在使用的是一个
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...
    }
}
我是通过看