8

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

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

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

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

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

4

4 回答 4

1

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

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

所以你有以下选择:

  • 两个端点
  • 配置您的客户端以了解默认凭据
  • 改变您的客户,以便他们能够应对挑战
于 2008-10-24T16:57:35.353 回答
0

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

但是,WCF 是非常可定制的,您可以通过编写一个自定义通道/绑定来完成您想要的操作。我建议您查看REST Chess源代码。它应该让你开始。

于 2008-10-18T04:04:55.270 回答
0

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

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

于 2008-10-20T18:53:58.377 回答
-2

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

于 2008-10-17T17:32:36.937 回答