我正在整理在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验证了这种行为,但并没有给出任何修复。
答案 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中执行此操作的详细信息。