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

本文关键字:SecurityException WCF 服务 通过 | 更新日期: 2023-09-27 18:27:23

我有一个ASP.NET MVC/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

我尝试实现一个处理SecurityAccessDeniedExceptionIErrorHandler,但我不能只在那里抛出一个SecurityException

SecurityException传播到Web客户端的选项是什么?

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

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

我现在使用的是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/

相关文章:
  • 没有找到相关文章