WCF WebHttp 混合身份验证(基本和匿名)

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

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

以上是关于WCF WebHttp 混合身份验证(基本和匿名)的主要内容,如果未能解决你的问题,请参考以下文章

为简单的 WCF 服务打开基本身份验证?

WCF - Windows 身份验证 - 安全设置需要匿名

没有 SSL 的 WCF 身份验证

IIS 混合匿名和 Windows 身份验证

通过禁用匿名身份验证出现 WCF REST 服务问题

WCF-TransportWithMessageCredential HTTP 请求未经授权,客户端身份验证方案“匿名”