【问题标题】:WCF WebHttp Mixed Authentication (Basic AND Anonymous)WCF WebHttp 混合身份验证(基本和匿名)
【发布时间】:2010-09-17 14:39:22
【问题描述】:

所有这些都与 WebHttp 绑定有关,托管在自定义服务主机中(此时不能选择 IIS)。

我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy。当我将端点的绑定配置为使用基本身份验证时,一切都按我的意愿工作(自定义主体、自定义角色等)。

我还想添加匿名 HTTP 访问的功能,并让我的自定义实现将匿名用户置于某些默认角色等。(如果未发送 Authenticate 标头)。

现在发生的情况是,在我的任何自定义代码被命中之前,匿名用户都会收到 401。如果我关闭 HTTP Basic 身份验证要求,则 Authenticate 标头将被完全忽略。

如何配置、或注入 Authenticate 标头,以两种方式执行此操作(无需创建 2 个单独的端点)?

【问题讨论】:

  • 我不知道答案...我刚刚给你+1,所以你达到1000 ;)
  • 来吧,这个问题有更好的答案,标记正确的几乎没有连贯性
  • @Sam 感谢您的反馈。我将答案分配在最合适的位置。这是一个艰难的决定。塞巴斯蒂安首先正确回答。当然,其他人更连贯。在重新阅读(自 Q 发布以来的最后 9 个月内情况发生了变化)时,我分配了我认为最好的内容。谢谢

标签: .net wcf http authentication http-authentication


【解决方案1】:

首先,服务根据specification正确响应匿名调用。

第二,这是不可能的。当您自托管您的服务并且您有一些 http 绑定时,WCF 将使用 @987654322@ 实例来响应 http 请求(在 System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen 中创建)。此侦听器有一个名为 HandleAuthentication 的方法,该方法在调用任何自定义代码之前被调用。它负责发回带有质询的 401 响应(WWW-Authenticate)。您对此无能为力。如果有,我想知道。

所以你有以下选择:

  • 两个端点
  • 配置您的客户端以了解默认凭据
  • 改变您的客户,以便他们能够应对挑战

【讨论】:

  • 其实 HttpListener 非常有能力支持多种认证方案。您只需要为 HttpListener 的 AuthenticationSchemeSelectorDelegate 属性实现一个处理程序。是 WCF 把你搞砸了。再一次。
  • 是的,WCF 没有提供将处理程序附加到此事件的方法,否则可能...
【解决方案2】:

我过去对此进行过研究,发现除非您创建 2 个单独的端点(这不是您想要的),否则无法通过配置实现。 WCF 根本不支持开箱即用。

但是,WCF 具有极高的可定制性,您可以通过编写自定义通道/绑定来实现此目的,从而满足您的需求。我建议你看看 REST Chess 源代码。它应该可以帮助您入门。

【讨论】:

    【解决方案3】:

    最好的办法是通过角色提供者实现默认角色,并让匿名用户自动加入该角色。然后以编程方式或通过策略注入(面向方面​​)策略进行设置,以便通过特定角色允许某些匿名访问。

    至于通过配置进行设置,如果可能的话,这将是相当困难的并且有点“hacky”。​​

    【讨论】:

    • 是的 - 但如果它没有获得身份验证标头,它甚至不会命中任何角色提供者。它只是从绑定代码中快速返回 401。
    【解决方案4】:

    我不这么认为...当我决定再次阅读您的问题并注意到您问题的最后陈述时,我只是在写您需要创建到单独的端点。所以答案是否定的(据我所知)

    【讨论】:

    • 知道在请求到达 WebHttpBinding 之前注入 http 标头的方法吗?也许是自定义绑定元素?在自定义绑定中操作 HTTP 标头的任何示例都很棒。
    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多