如何预防';请求主体权限失败';从错误的WCF客户端?

如何预防';请求主体权限失败';从错误的WCF客户端?,wcf,authorization,principal,Wcf,Authorization,Principal,我有一个WCF服务与几个操作。 每个操作都有“PrincipalPermission”标记,如下所示: [PrincipalPermission(SecurityAction.Demand, Role = "Administrator")] public ProductsDto GetAllProducts() { // Do operation here ... } 问题是-如果用户不是“管理员”角色的一部分-服务将引发异常 主体权限请求失败 这会将客户端的通道损坏为“故障”状态

我有一个WCF服务与几个操作。 每个操作都有“PrincipalPermission”标记,如下所示:

[PrincipalPermission(SecurityAction.Demand, Role = "Administrator")]
public ProductsDto GetAllProducts()
{
     // Do operation here ...
}
问题是-如果用户不是“管理员”角色的一部分-服务将引发异常

主体权限请求失败

这会将客户端的通道损坏为“故障”状态

我希望能够以某种方式捕捉到这一点,并向客户发送“错误”消息

这样客户就知道他试图做一些他不应该做的事情,而不会影响频道

我尝试在操作中使用“try-catch”块,但没有任何帮助。 异常发生在操作本身的“外部”


如何解决这个问题?

有一个特殊的接口,您可以实现并连接WCF服务来处理异常。使用
IErrorHandler
可以处理安全异常和序列化代码引发的任何异常


关于客户端通道进入故障状态的另一个注意事项:我建议为从客户端执行的每个工作单元创建一个新的客户端对象。重用客户机对象会导致此类问题。

有一个特殊的接口,您可以实现并连接WCF服务来处理异常。使用
IErrorHandler
可以处理安全异常和序列化代码引发的任何异常


关于客户端通道进入故障状态的另一个注意事项:我建议为从客户端执行的每个工作单元创建一个新的客户端对象。重用客户机对象会导致此类问题。

我不想为每个请求打开客户机,因为还有一种轮询机制,每60秒发生一次,而且-客户机需要输入用户名和密码,我不想将它们存储在客户机的内存中。你能再详细说明一下IErrorHandler是如何解决我的问题的吗?如何捕获主要错误并向客户端发送适当的消息而不造成错误?我不想为每个请求打开客户端,因为还有一种每60秒发生一次的轮询机制,而且-客户端需要输入用户名和密码,我不想将它们存储在客户端的内存中。你能再详细说明一下IErrorHandler是如何解决我的问题的吗?如何捕获主要错误并向客户端发送适当的消息而不造成错误?