IIS在WCF服务调用之后重定向时转储授权标头,而不使用尾部斜杠

时间:2011-08-08 18:03:19

标签: wcf rest iis-7 hmac

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

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 使用一个尾部斜杠。很有帮助,您认为,但问题是重定向会转储授权标头。

我的服务课程都是洁净的,并且在其他各方面都很出色。 有没有办法让我能够在重定向的情况下维护该授权标头?我怀疑该解决方案将是一个IIS配置的东西,虽然我想我可以把所有各种路由攻击到位以获取uri的无斜线版本。

更新
我发现this article验证了这种行为,但并没有给出任何修复。

1 个答案:

答案 0 :(得分:0)

所以我不完全确定为什么IIS正处于这里的中间。当你说“转储授权标题”时,你的意思是什么?你的意思是它重新发送它作为重定向的一部分,或者它不发送它?

WCF明智的你可以保持重定向不发生。这是其中一个你想要在微软打电话给几乎正确的人。 UriTemplate类本身可以通过恰当命名的IgnoreTrailingSlash property忽略尾部斜杠。遗憾的是,WCF WebInvoke/Get属性实际上并未以任何方式映射此属性,因此始终创建的模板与您在UriTemplate属性中键入的内容完全绑定。

因此,我承认,最简单的解决方法是使用具有尾部斜杠的第二个签名来重载WCF合同上的方法。例如:

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

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

很难过,对吗?如果这是一个你想要反复重复的模式,那就特别糟糕。所以另一个半但不太苛刻的选择是编写自定义操作选择器逻辑,您可以通过自定义行为将其应用于您的服务。关于在this StackOverflow answer中执行此操作的详细信息。