IIS在WCF服务调用后重定向时转储授权标头,不带尾随斜杠

IIS在WCF服务调用后重定向时转储授权标头,不带尾随斜杠,wcf,rest,iis-7,hmac,Wcf,Rest,Iis 7,Hmac,我正在整合一个在IIS7网站实例中运行的WCF REST服务,并使用一个身份验证方案,该方案将令牌和HMAC插入到身份验证头中。典型请求上的示例标题列表可能如下所示: GET http://api.mydomain.com/Contacts HTTP/1.1 Authorization: 774F035C-FRTB-4207-DDDD-31BF1534AD96:9h0Whke9Bgi3XSHPo/YSXw== Content-Type: application/xml; charset=utf-

我正在整合一个在IIS7网站实例中运行的WCF REST服务,并使用一个身份验证方案,该方案将令牌和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
    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)));
    }
我使用路由而不是.svc文件设置服务,因此我的Global.asax如下所示:

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
    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的无斜杠版本

更新:

我发现验证了这个行为,但实际上并没有给出任何修改。

所以我不完全明白为什么IIS正处于这里。当你说“转储授权头”是什么意思?你是说它是作为重定向的一部分发送还是不发送

就WCF而言,您可能可以阻止重定向发生。这是其中一个你会想扇某人耳光的地方,因为他几乎把事情做好了。
UriTemplate
类本身能够通过恰当命名的。不幸的是,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();
}
[运营合同]
[WebGet(UriTemplate=“/Users”)]
公共列表GetUsers()
{
…这里有一些代码。。。
}
[经营合同]
[WebGet(UriTemplate=“/Users/”)]
公共列表getUsersFlash()
{
返回这个.GetUsers();
}

Fugly,对吧?如果你想一次又一次地重复这种模式,那就更糟糕了。因此,另一个半但不太老套的选择是编写自定义操作选择器逻辑,通过自定义行为将其应用于服务。有关此操作的详细信息,请参阅。

感谢您的回复。要回答第一个问题,IIS不会将其作为重定向的一部分重新发送。看看我在我的原始帖子中添加的那篇文章,它看起来像是设计出来的——根据微软的观点,授权应该再次发生。是的,好吧,我完全理解,但我不清楚这是否正是发生在你身上的事情。让我们退一步,您是客户机还是其他不受您控制的应用程序是此服务的客户机?你为什么不首先请求正确的URL呢?您的服务被定义为没有尾部斜杠,所以。。。这是你的客户应该要求的。有人可能会说,应该允许使用斜杠,但从技术上讲,不断重定向请求是浪费带宽的,因为最终它不是同一个URL。我无法控制的其他应用程序将是客户端。我确实不需要尾部斜杠,因为它更为RESTful,但我不希望错误消息是错误消息。我更喜欢404之类的。不幸的是,不管我指定的
UriTemplate
,服务路由定义似乎使这不可能实现。结果证明这个解决方案似乎不起作用。将UriTemplate更改为包含或排除斜杠似乎不会改变重定向的构造方式。看起来删除授权标头是出于设计。糟糕。是的,我认为你不能通过改变服务器端来解决这个问题。我只是建议您在服务器端支持正确的URL,并确保您的所有客户端都访问该URL,这样就不会出现重定向。