这更多是出于好奇,因为我没有找到任何关于这种现象的答案或文档,但这是场景:
有两个服务/应用程序,都在IIS 7上托管。服务1从外部源(浏览器,提琴手等)接收HTTPS请求,并验证调用服务2所需的请求,因此服务1使通过HTTP对服务进行新的单独呼叫2. 此呼叫在请求对象中添加了授权标头。当服务2收到此呼叫时,认证标头已消失,好像脱光了。因此,身份验证失败,这将返回到服务1,然后服务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();
答案 0 :(得分:0)
“服务2”很可能具有类似于“如果传入请求是HTTP忽略授权标头”的代码。这是非常合理的行为,因为HTTP流量可以非常容易地被嗅探和重放 - 所以诚实的服务器阻止呼叫者进行潜在的不安全行为。
答案 1 :(得分:0)
我的一位同事遇到了这种行为的根本原因是IIS的“URL Rewrite”模块。我们设置了将http请求永久重定向到https,并且此重定向是标头被丢弃的位置。 IIS做到这一点有点奇怪,但我想我会尝试别的东西来解决这个问题。