首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF - IErrorHandler与身份验证

WCF - IErrorHandler与身份验证
EN

Stack Overflow用户
提问于 2011-08-08 20:07:46
回答 1查看 465关注 0票数 2

我正在编写一个带有一些身份验证和自定义错误处理程序的WCF服务。但是,我遇到了这个问题:当身份验证抛出异常时,我的IErrorHandler实现不会受到影响,但在其他exeptions中运行良好。

身份验证是否在构建IErrorHandler之前运行?我是不是找错了树,试图让它来捕捉这些错误?

是的,我已经尝试(并且正在)在我的身份验证中抛出一个FaultException,而不是SecurityTokenException

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-26 23:20:50

因此,首先要确保您的自定义错误处理程序也实现了IServiceBehavior。IServiceBehavior要求您实现一些其他方法,但最重要的是"ApplyDispatchBehavior",您必须将ErrorHandler添加到通道调度器中。

C#

代码语言:javascript
复制
public class CustomErrorHandler: IServiceBehavior, IErrorHandler
{
    public bool HandleError(Exception error)
    {
        //Return True here if you want the service to continue on as if
        //  the error was handled

        return true;
    }

    public void ProvideFault(Exception error,
                             MessageVersion version,
                             ref Message fault)
    {
        FaultException fe = new FaultException(
            new FaultReason(error.Message),
            new FaultCode("Service Error"));

        MessageFault mf = fe.CreateMessageFault();
        fault = Message.CreateMessage(version, mf, fe.Action);
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, 
                                      ServiceHostBase serviceHostBase)
    {

        IErrorHandler eh = new CustomErrorHandler();

        foreach (ChannelDsipatcherBase cdb in serviceHostBase.ChannelDispatchers)
        {
            ChannelDispatcher cd = cdb as ChannelDispatcher;
            cd.ErrorHandlers.Add(eh);
        }

    }

    public void AddBindingParameters(ServiceDescription serviceDescription,
                                     ServiceHostBase serviceHostBase, 
                                     Collection<ServiceEndpoint> endpoints, 
                                     BindingParameterCollection bindingParameters)
    {
        //Add binding parameters if you want, I am not
    }

    public void Validate(ServiceDescription serviceDescription,
                         ServiceHostBase serviceHostBase)
    {
        //Add custom fault validation here if you want
    }
}

然后,您需要将CustomErrorHandler添加为服务行为,并添加该行为

web.config

代码语言:javascript
复制
<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="ErrorHandler"
                 type="ServiceNamespace.CustomErrorHandler, ServiceNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        </behaviorExtensions>
    </extensions>
    <behaviors>
        <serviceBehaviors>
            <behavior name="MyBehavior1">
                <!--Put other behaviors for your service here then add the next line-->
                <ErrorHandler />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

这样,您抛出的所有异常都将被转换为错误,并返回给客户端。

在SecurityTokenExceptions的情况下,您不希望立即将这些转换为错误异常。实际上,您确实希望在自定义验证中将它们作为SecurityTokenExceptions抛出,以便服务/服务器识别安全授权失败,并自动作为"403 :访问被拒绝“的错误等价物返回。我不是100%,但我认为自定义身份验证和验证部分发生在加载自定义服务行为之前,比如错误处理程序。不幸的是,如果您需要对身份验证中的某些内容进行故障排除,则需要在服务上打开WCF跟踪,请参阅这篇标题为"How to turn on WCF Tracing“的文章。

如果需要记录失败的身份验证尝试,则可能需要将其直接放入自定义验证器中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6981840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档