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

时间:2008-10-16 18:54:20

标签: .net wcf http authentication http-authentication

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

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

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

现在发生的事情是,在我的任何自定义代码被命中之前,匿名用户被给予401。如果我关闭HTTP基本身份验证要求,则完全忽略Authenticate标头。

如何配置或注入Authenticate标头,以便双向完成此操作(不创建2个单独的端点)?

4 个答案:

答案 0 :(得分:1)

首先,根据specification,服务正确响应匿名呼叫。

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

所以你留下了以下选项:

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

答案 1 :(得分:0)

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

但是,WCF非常可定制,您可以通过编写自定义通道/绑定来实现此目的。我建议您查看 REST Chess源代码。它应该让你开始。

答案 2 :(得分:0)

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

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

答案 3 :(得分:-2)

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