0

我正在组合一个在 IIS 7 网站实例中运行的 WCF REST 服务,并且我正在使用HMAC身份验证方案,该方案将令牌和 HMAC 插入到身份验证标头中。典型请求的示例标头列表可能如下所示:

GET http://api.mydomain.com/Contacts HTTP/1.1
Authorization: 774F035C-FRTB-4207-DDDD-31BF1534AD96:9h0Whke9Bgi3XSHPo/YSXw==
Content-Type: application/xml; charset=utf-8
Host: api.mydomain.com
Connection: Keep-Alive

我使用路由而不是 .svc 文件设置了服务,所以我的 Global.asax 看起来像这样:

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("Users", new WebServiceHostFactory(), typeof(UsersService)));
        RouteTable.Routes.Add(new ServiceRoute("Widgets", new WebServiceHostFactory(), typeof(WidgetsService)));
    }

问题是,当使用这样的路由声明服务时,如果 IIS 收到对没有尾部斜杠WebGet的uri的调用,它会执行 307 重定向到带有尾部斜杠的 uri。您会认为这很有帮助,但问题是重定向转储了 Authorization 标头。

我的服务课程都是犹太洁食,在其他各个方面都做得很好。有没有办法让我能够在重定向的情况下维护该 Authorization 标头?我怀疑解决方案将是一个 IIS 配置问题,尽管我想我可以放置各种路由黑客来获取 uri 的无斜线版本。

更新:
我发现这篇文章验证了这种行为,但并没有真正给出任何修复。

4

1 回答 1

0

所以我不完全确定为什么 IIS 会介入其中。当您说“转储授权标头”时,您是什么意思?您的意思是它作为重定向的一部分重新发送它还是不发送它?

WCF 明智,您可能可以防止重定向发生。这是您想要在微软几乎做对的事情之一。类本身具有通过恰当命名的属性UriTemplate忽略斜杠的能力。不幸的是,WCF属性实际上并没有以任何方式映射此属性,因此始终会创建完全绑定到您在属性中键入的任何内容的模板。IgnoreTrailingSlashWebInvoke/GetUriTemplate

因此,最简单的解决方法(我承认这很讨厌)是使用带有斜杠的第二个签名重载 WCF 合同上的方法。例如:

[OperationContract]
[WebGet(UriTemplate="/Users")]
public List<User> GetUsers()
{
   .... some code here ...
}

[OperationContract]
[WebGet(UriTemplate="/Users/")]
public List<User> GetUsersSlash()
{
   return this.GetUsers();
}

丑陋的,对吧?如果这是您想要一遍又一遍地重复的模式,则尤其糟糕。因此,另一个半但不那么hacky的选项是编写自定义操作选择器逻辑,您可以通过自定义行为将其应用于您的服务。在这个 StackOverflow 答案中有更多关于这样做的细节。

于 2011-08-08T20:11:57.670 回答