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

8
所有这些都涉及WebHttp绑定,托管在自定义服务主机中(此时不考虑IIS)。我已经实现了自定义的UserNamePasswordValidator和自定义的IAuthorizationPolicy。当我将终结点的绑定配置为使用基本身份验证时,一切都按照我的意愿进行(自定义负责人、自定义角色等)。我希望添加匿名HTTP访问的能力,并使我的自定义实现将匿名用户放入某些默认角色等(如果未发送Authenticate头)。现在发生的是,在命中任何自定义代码之前,匿名用户会收到401错误。如果关闭HTTP基本身份验证要求,则Authenticate头将被完全忽略。如何配置或注入Authenticate头以这两种方式进行(而不创建2个单独的端点)?

1
我不知道答案... 我只是给你加了1,这样你就能达到1000了 ;) - sebagomez
来吧,这个问题有更好的答案,被标记为正确的那个几乎没有条理。 - Sam Saffron
@Sam 感谢您的反馈。我将答案分配到最合适的位置。这是一个艰难的决定。Sebastian先回答了正确的答案。当然,其他人更连贯。在重新阅读(自问题发布以来已经过去了9个月),我已经分配了我认为最好的答案。谢谢。 - TheSoftwareJedi
4个回答

1

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

其次,这是不可能的。当您自己托管服务并且具有一些http绑定时,WCF将使用System.Net.HttpListener实例来能够响应http请求(在System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen中创建)。此侦听器具有一个称为HandleAuthentication的方法,该方法在调用任何自定义代码之前被调用。它负责发送带有挑战(WWW-Authenticate)的401响应。您无法对此做任何事情。如果可以,请告诉我。

因此,您只剩下以下选项:

  • 两个端点
  • 配置客户端以了解默认凭据
  • 更改客户端,使其能够响应挑战

实际上,HttpListener非常能够支持多种身份验证方案。您只需要为HttpListener的AuthenticationSchemeSelectorDelegate属性实现一个处理程序即可。是WCF在让你失望。再一次。 - Darrel Miller
是的,WCF并没有提供一种方法来附加处理程序到这个事件,否则就可能了... - Ronald Wildenberg

0

我过去曾经研究过这个问题,并发现除非你创建2个单独的端点(这不是你想要的),否则无法通过配置实现。 WCF默认情况下根本不支持此功能。

然而,WCF具有极高的可定制性,你可以编写自定义通道/绑定来实现你想要的功能。 我建议你查看REST Chess源代码。它应该能够帮助你入门。


0
你最好通过角色提供程序实现默认角色,并让匿名用户自动加入该角色。然后,通过编程或策略注入(面向方面)策略,设置某些匿名访问可以通过特定角色允许。
至于通过配置设置这个,如果可能的话,这将相当困难和有点“hacky”。

是的 - 但如果它没有收到身份验证标头,它甚至不会触发任何角色提供程序。 它只会从绑定代码快速返回401。 - TheSoftwareJedi

-2

我不这么认为...我刚写完你需要创建两个不同的端点,然后决定再次阅读你的问题并注意到你问题的最后一句话。所以答案是否定的(就我所知)


有没有一种方法可以在请求到达WebHttpBinding之前注入http头?也许是自定义绑定元素?如果有关于在自定义绑定中操作HTTP头的示例,那就太好了。 - TheSoftwareJedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接