【问题标题】:Handing unauthorized requests in WCF?在 WCF 中处理未经授权的请求?
【发布时间】:2014-07-08 04:20:53
【问题描述】:

我们有一个 WCF 服务,使用 webhttp 绑定。用户通过身份验证,然后调用一个方法。在该方法中,我们会检查与用户相关的各种设置以及特定于请求的一些信息,然后才能知道用户是否有权拨打电话。

由于这是 WCF,我认为我应该抛出某种 FaultException,但不清楚是否有最佳实践。

我的想法是,一旦我知道我将抛出什么异常,我会添加一个 IErrorHandler,它将标头正确设置为 403。

两个问题: 1) 未经授权的请求是否有标准的 FaultException?即相当于403的http状态码? 2)我应该能够处理我将抛出的异常并将响应代码更改为 403 吗?我可以通过自定义错误消息吗?我看过一些帖子,使用 catch 中的操作上下文设置标头不会传播到客户端。

理想情况下,我可以将状态设置为 403,并提供其他信息,例如“您必须是管理员组的成员才能添加用户”

【问题讨论】:

    标签: wcf http-status-code-403 faultexception


    【解决方案1】:

    因为你使用的是 webhttp 绑定,传统的 WCF 故障管理在这里不适用,最好使用WebFaultExceptionWebFaultException<>

    Public string MyOperation()
       // Operation logic
       // ...   
       throw new WebFaultException<string>("You must be part of the administrators group to add a user", HttpStatusCode.Forbidden);
    }
    

    正如您所想,在开发 HTTP(类 REST)服务时使用标准 HTTP 状态代码非常重要。

    【讨论】:

    • 我讨厌采用不应绑定到绑定的 WCF 服务并添加 WebFaultException 的想法。我的想法是抛出一些标准的 WCF 未经授权的异常,然后在可以绑定到端点的 IErrorHandler 中处理它。这样业务逻辑代码就不会绑定到 webHttpBindings。
    【解决方案2】:

    根据我的经验,至少使用 wshttpbinding 和 basichttpbinding 抛出错误异常会导致您的 Web 服务失败,因此我不推荐这种方法。

    如果您想向未经授权的用户发送回消息,只需发送 HTML 响应,将状态设置为 400 响应中的任何一个似乎合适的响应。

    但是根据经验,故障异常,即使它们是对用户操作的受控响应,而不是实际处理错误,也会导致您的 Web 服务失败。我认为它们应该是保留的真正处理异常。

    【讨论】:

      【解决方案3】:

      我继续从 FaultException 派生自定义异常,然后添加了一个 IErrorHandler 来设置适当的标头。

      这似乎是两全其美。代码只抛出从 WCF 中使用的异常派生的异常,所有特定于 http 绑定的处理都是通过业务逻辑之外的 IErrorHandler 完成的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 2014-12-01
        • 2017-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多