【发布时间】:2011-05-11 14:54:22
【问题描述】:
我有一个 ASP.NET (MVC) 网站,它提供静态内容(图像)以及来自同一域的动态内容。该站点使用表单身份验证,并具有登录控制器。人们发现自己以随机间隔登录或退出时出现了一些非常奇怪/不规则的问题,我们已将其归结为反向代理缓存图像文件的问题,该图像文件具有设置 cookie 响应标头授权饼干。缓存后,每个人都会获得相同的身份验证 cookie,这会导致一些非常奇怪的结果。
我的问题是 - 图片首先如何获得 set-cookie 标头?什么是 ASP.NET 表单身份验证模块会导致此问题 - 它肯定会在主要 HTML 内容响应上设置 cookie。我知道 auth cookie 然后与所有后续请求一起发送到域,但我无法弄清楚 cookie 是如何设置的。
(顺便说一句,这个问题也可能是至少两个存在类似问题的现有大型电子商务网站的罪魁祸首,没有解决方案,所以这是一个很好的解决方案。
响应如下所示(取自 fiddler)。
HTTP/1.1 200 OK
Cache-Control: public, max-age=86400,max-age=86400
Content-Type: image/png
Last-Modified: Thu, 04 Nov 2010 16:00:52 GMT
Accept-Ranges: bytes
ETag: "0528474397ccb1:0"
Server: Microsoft-IIS/7.5
Set-Cookie: my-auth-cookie=6BC25F1EF71989466A48C0120E7739E; path=/; HttpOnly
Date: Wed, 17 Nov 2010 17:15:08 GMT
Content-Length: 15790
更新:附加信息 - 我们在 Win2008 R2、64 位上使用 IIS 7.5,并且该应用在使用集成管道/.net 4 的应用池下运行。
更新 2:我不是在寻找解决问题的方法,我们已经有了。我正在寻找这个问题的答案,这就是为什么它首先发生?请不要回答告诉我有关子域或 cookie 的工作原理!
更新3:添加请求:
GET https://www.example.com/sprite.png HTTP/1.1
Host: www.example.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: my-auth-cookie=6BC25F1EF71989466A48C0120E7739E;
【问题讨论】:
-
+1,非常有趣的问题。 @Hugo,你能重现这种行为还是随机的?
-
@Hugo,您是否在您的网站上强制执行 SSL,因为我注意到此 cookie 设置时没有
secure标志? -
您的表单身份验证设置是什么?我尝试使用
slidingExpiration和timeout属性来重现它。当表单身份验证需要重新设置 cookie 过期日期时,来自静态文件的响应确实添加了 set-cookie 标头。但是,该 set-cookie 标头还包含一个expires指令,这与您的情况不同。 -
直接来自 MSDN (hrb.fm/bsGes3):“如果发出请求并且超过一半的超时间隔已经过去,则滑动到期会重置有效身份验证 cookie 的到期时间。”这里的杀手级问题是这是否适用于在请求静态资源(不进行其他处理)时收到的 cookie,鉴于集成管道的性质,我认为答案是肯定的。接下来的问题是是否可以为非 ASP.NET 资源禁用 FormsAuth 模块。
-
IIS7+ 具有路由静态内容的能力(您无疑知道),并且表单身份验证显然是运行时本身的托管代码部分。因此,假设在集成管道模式下,如果启用,它只是被检查/运行是合乎逻辑的。你在 web.config 中有这个设置吗?
标签: asp.net-mvc iis forms-authentication reverse-proxy