通过 WCF 服务的多跳传递 SecurityException
Pass SecurityException through multiple hops of WCF services
我有一个用作 WCF 客户端的 ASP.NET MVC/WebApi 应用程序。我的 WCF 服务通过 ClaimsPrincipalPermission
授权,如果当前用户和数据的组合不匹配(例如,用户正在尝试访问其他用户的数据),还会抛出 SecurityException
。
我在我的过滤器中将此作为 SecurityAccessDeniedException
和 return 状态代码 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
?
我现在使用的是 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/
得到了这个想法
我有一个用作 WCF 客户端的 ASP.NET MVC/WebApi 应用程序。我的 WCF 服务通过 ClaimsPrincipalPermission
授权,如果当前用户和数据的组合不匹配(例如,用户正在尝试访问其他用户的数据),还会抛出 SecurityException
。
我在我的过滤器中将此作为 SecurityAccessDeniedException
和 return 状态代码 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
?
我现在使用的是 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/
得到了这个想法