如何在ClaimsAuthenticationManager.Authenticate期间处理错误

时间:2013-09-25 17:07:40

标签: wcf error-handling wif claims-based-identity http-status-code-503

我在我的WCF服务中实现了ClaimsAuthenticaitonManager,以接受来自我们企业ADFS的传入声明,并将其转换为与系统用户相关的声明(如果AD用户未注册为系统的一部分,则生成未经授权的响应)。这些转换后的声明是通过查询应用程序数据库生成的,我想通过在无法访问数据库转换声明的情况下从Authenticate方法返回503状态来解决网络连接问题的可能性。

首先,这是一种合理的方法吗,其次,是否有可能在请求管道中做这样的事情,我该如何处理呢?

1 个答案:

答案 0 :(得分:1)

在WCF SOAP服务中执行此操作的正确方法是使用自定义ErrorHandler。无论您是否使用WIF,都是如此。

自定义错误处理程序实现IErrorHandler。这允许您的服务抛出异常,这些异常由WCF传递给您注册的自定义错误处理程序。这允许您检查异常并创建适当的错误。

在您的情况下,您可能会抛出来自SQL客户端的异常。除了创建正确的错误之外,您还可以执行任何其他相关操作(例如,通常记录错误)。

IErrorHandler上的两个方法是

ProvideFault(Exception error, MessageVersion version, ref Message fault)允许您触发抛出的异常并修改或创建正确的错误。

响应返回给客户端后调用的

HandleError(Exception error)。您可以在此处执行记录错误等操作。

有关如何实现这一点的详细信息,请访问

http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/07/wcf-extensibility-ierrorhandler.aspx

错误处理程序可以使用代码轻松连接,如上面的链接所示。通过一些额外的工作,可以通过实现自定义服务行为扩展来使用web.config进行连接。

可以找到如何执行此操作的示例

http://weblogs.asp.net/pglavich/archive/2008/10/16/wcf-ierrorhandler-and-propagating-faults.aspx

尽管如此,通常对于SOAP服务,您不会直接返回HTTP状态代码(即503状态)。相反,您可以将错误包装在FaultException中并返回。

对于WCF REST,您只需抛出WebFaultExceptionwebHttpBinding的内置错误处理程序将处理转换为HTTP错误:

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx