在我的SSO服务中,我在验证响应消息
后重定向传入请求HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: /home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjIwNDIwO3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs=
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 27 Jan 2014 09:20:36 GMT
Content-Length: 261
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjIwNDIwO3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs=">here</a>.</h2>
</body></html>
上面的302消息发生在客户端和服务器之间的一系列重定向之后我使用fiddler将其列在下面
# Result Protocol Host URL Body Caching Content-Type Process Comments Custom
4 302 HTTPS client.net /ok/r/oauth/authorize?client_id=bededeb806f783b75ef94ad871a4e03e2c7aeb1fb316d8822233afaa664d17cb&redirect_uri=https%3A%2F%2Fexample.sso.com%2FOKJobMatch.aspx&state=hk1udegmnspyvum5obcwscwe&response_type=code 232 no-cache, private text/html; charset=utf-8 iexplore:5324
Suceeded
6 301 HTTPS example.sso.com /OKJobMatch.aspx?code=c4ee0346f27db36ea662b1d14d3adc6ba6d33e11c3a9dddf759619cf778b0b24&state=hk1udegmnspyvum5obcwscwe 317 private text/html; charset=utf-8 iexplore:5324
Suceeded
8 302 HTTPS example.com /home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjQwNTQzO3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs= 261 private text/html; charset=utf-8 iexplore:5324
Suceeded with response which mentioned above in the question
9 404 HTTPS client.net /home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjQwNTQzO3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs= 0 iexplore:5324
Failed
现在所有其他浏览器,包括IE 9,10和Chrome,Mozilla都能够理解这一点并重新定向,但IE 8无法重定向,但它会引发404错误。
进一步分析
我们发现,一旦传递302消息,IE就会使用客户端URL的域而不是服务器URL
所以不要去https://example.com/home 它将http://client.net.home。这看起来很奇怪,因为example.com是提供重定向消息的那个。
这与http消息的referrer属性有关,因为我注意到在客户端消息中设置了referrer
重定向后的客户端请求[会产生404错误]
GET https://client.net/home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjUwNDM4O3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs= HTTP/1.1
Accept: image/jpeg, image/gif, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
Referer: https://deployment.ajla.net/ok/mn_loginstatistics_dsp.cfm
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)
Accept-Encoding: gzip, deflate
Host: deployment.ajla.net
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: _ga=GA1.3.502780954.1391010694; CFID=90758; CFTOKEN=4b494a1b21bbdc06-D9196ABC-FAE3-1AFE-97F781B8328159A0; TEST=1; USAGE_BYPASS=A819843C5390612C307C2E9A433D04101C64C9842FB41146ECFE739EDEDB13F4D692A9A537C758E1F5548B2306170514FAE5F13FF767A436FD24140F4B90F6A2; AJLAUTHSESSION=D93D4D42-ABAC-D007-DC3A2A48361A041C; _joblink_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTg2MTlkMDZmZjZhMDIwODhkZWJhMjIxODNiN2I2NTNmBjsAVEkiDHVzZXJfaWQGOwBGaQNZnRk%3D--8592abe6d424b90671f013da99d74a1df8e84a33
对于相同的情况,mozilla和其他浏览器选择www.example.com作为域。这是因为referrer属性,如果是,有没有办法在客户端代码中修复它?
编辑2
<rewrite>
<rules>
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="SeeOther" />
</rule>
</rules>
</rewrite>
我注意到,在第一次从客户端站点重定向到我们的站点时,有两个302发生,第一个返回一个相对路径。第二个返回绝对路径。第二个是从源生成的,但第一个不是源。我不确定这个重定向发生在哪里。我怀疑这可能是因为在网站上设置了http重定向。但我不确定只是粘贴了上面的http重定向设置。
有人可以告诉你有没有办法解决这个问题?
答案 0 :(得分:1)
由于所有浏览器都会理解绝对路径,因此返回绝对路径。我们将无法改变IE8。
答案 1 :(得分:0)
根据您的SSO处理程序的工作方式,您可以使用Response.Redirect( ... )
函数重定向浏览器。此函数将使用"~/path/to/file"
表示法获取相对URI。
答案 2 :(得分:0)
我已经使用了一种解决方法来解决这个问题,我知道它可能不是一个合法的解决方案,但我没有别的选择让它在IE8中运行
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302)
{
if (Context.Response.RedirectLocation.ToLower().StartsWith("/home") && Request.Params.Get("s") != null)
{
Context.Response.RedirectLocation = System.Web.HttpContext.Current.Request.Url.OriginalString;
}
}
}