0

这更多是出于好奇,因为我无法找到任何有关此现象的答案或文档,但情况如下:

有 2 个服务/应用程序,都托管在 IIS 7 上。服务 1 从外部源(浏览器、提琴手等)接收 HTTPS 请求,并验证它需要调用服务 2 的请求,因此服务 1 自己创建,通过 HTTP 对服务 2 的新的单独调用。此调用将 Authorization 标头添加到请求对象。 当服务 2 收到此调用时,身份验证标头消失了,就像被剥离了一样。因此身份验证失败,这将返回到服务 1,然后拒绝外部调用。

有没有人解释为什么这个标头以及我在测试中看到的其他一些标头无法通过 HTTP 调用完成?这是 IIS 或 ASP.NET 的行为还是什么?如果对服务 2 的调用是 HTTPS,则标头可以正常通过。我正在生成这样的请求:

string uriendpoint = "http://service.test.com/testService.svc/authtest";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriendpoint);
request.Credentials = CredentialCache.DefaultCredentials;
var authField = MD5Hash("test:test!!2013");
request.Headers.Add(HttpRequestHeader.Authorization, authField.ToString());
request.Method = WebRequestMethods.Http.Get;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
4

2 回答 2

0

“服务 2”很可能具有类似于“如果传入请求是 HTTP 忽略授权标头”的代码。这是非常合理的行为,因为 HTTP 流量很容易被嗅探和重放 - 因此诚实的服务器会阻止调用者进行潜在的不安全行为。

于 2013-06-21T23:59:11.390 回答
0

我的一位同事发现这种行为的根本原因是 IIS 的“URL 重写”模块。我们将它设置为将 http 请求永久重定向到 https,并且此重定向是标头被丢弃的地方。IIS 这样做有点奇怪,但我想我会尝试其他方法来解决这个问题。

于 2013-06-24T16:43:05.323 回答