如何防止“请求主体权限失败”导致 WCF 客户端出错?

Posted

技术标签:

【中文标题】如何防止“请求主体权限失败”导致 WCF 客户端出错?【英文标题】:How to prevent 'Request for principal permission failed' from faulting WCF client? 【发布时间】:2012-05-15 06:41:25 【问题描述】:

我有一个包含多个操作的 WCF 服务。 每个操作都有“PrincipalPermission”标签,如下所示:

[PrincipalPermission(SecurityAction.Demand, Role = "Administrator")]
public ProductsDto GetAllProducts()

     // Do operation here ...

问题是 - 如果用户不是“Administratir”角色的一部分 - 服务会引发异常

请求主体权限失败

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

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

让客户知道他试图做他不应该做的事情,而不会导致通道出错!

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

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

有一个特殊的接口IErrorHandler,您可以实现它并与 WCF 服务挂钩以处理异常。使用IErrorHandler 可以让您处理安全异常和序列化代码抛出的任何异常。

关于客户端通道进入故障状态的另一个说明:我建议为您从客户端执行的每个工作单元创建一个新的客户端对象。重用客户端对象会解决这类问题。

【讨论】:

我不想为每个请求打开一个客户端,因为还有一个每 60 秒发生一次的轮询机制,而且 - 客户端需要提供用户名和密码,而我没有不想将它们存储在客户端的内存中。您能否详细说明 IErrorHandler 如何解决我的问题?如何捕获 PRINCIPAL 错误并向客户端发送适当的消息而不出错?

以上是关于如何防止“请求主体权限失败”导致 WCF 客户端出错?的主要内容,如果未能解决你的问题,请参考以下文章

防止对我的 wcf 服务的跨域请求

如何使用共享密钥限制对 WCF 服务的访问

如何防止 WCF 服务进入故障状态?

WCF 客户端,XML 命名空间前缀导致空对象

如何防止因编译器开启优化,而导致程序执行错误

WCF+Nhibernate循环引用导致序列化的问题