C# 图像缓存、HTTPHandler和FormsAuthentication

C# 图像缓存、HTTPHandler和FormsAuthentication,c#,iis,cookies,C#,Iis,Cookies,设置: 我在一个网站上工作,该网站使用表单身份验证使用cookies存储登录票据。该站点还有一个管理存储在数据库中的图像的HTTPHandler。处理程序缓存要公开的图像,并在20分钟后过期。我们注意到,由于图像与页面具有相同的生命周期,因此图像还包括表单身份验证cookie。配置为IIS 6,Win2k服务器,未启用内容过期 问题: 我们正在经历的是一个人登录并点击几个页面。然后,人员B点击未登录的默认页面,获取人员A的cookie,并能够查看人员A的所有数据。我们通过在IIS中打开内容过期功

设置:

我在一个网站上工作,该网站使用
表单身份验证
使用cookies存储登录票据。该站点还有一个管理存储在数据库中的图像的
HTTPHandler
。处理程序缓存要公开的图像,并在20分钟后过期。我们注意到,由于图像与页面具有相同的生命周期,因此图像还包括
表单身份验证
cookie。配置为IIS 6,Win2k服务器,未启用内容过期

问题:

我们正在经历的是一个人登录并点击几个页面。然后,人员B点击未登录的默认页面,获取人员A的cookie,并能够查看人员A的所有数据。我们通过在IIS中打开内容过期功能复制了一次该问题,但没有始终如一地复制,因此我们不确定内容过期功能是否有助于我们复制该问题。我们假设,由于图像被缓存为公共图像,并且它们还包含带有
表单身份验证的cookie,因此人员B可能会无意中获取人员A的cookie。我们知道这不是对网站的攻击


有没有人经历过类似的行为?如果是这样的话,你能就如何始终如一地重现这个问题提供一些建议吗?

为什么B个人会得到A个人的cookie?我假设你的意思是B的会话cookie与A的登录ID相关联。这就是问题的核心

在我看来,A的登录ID存储在一个可以跨请求的位置,比如临时文件或数据库中,而无需将其与会话cookie关联。(相关问题:正在缓存页面输出,但未与会话cookie正确关联或通过会话cookie检索。)存储或缓存会话信息时,必须将其与cookie关联。考虑属于浏览器的会话数据,而不是登录


我将安装Firefox扩展LiveHTTP并检查请求/响应头。我打赌,你会看到A和B有不同的饼干,但是在服务器上,它们都与相同的登录ID关联。

我们假设cookie位于响应头中,并且将个人A的机器上存在的相同cookie写入个人B。需要注意的是,IE 7中的个人A和FireFox中的个人B都出现了此问题。此外,当人员A注销时,也会注销人员B,因为Formsauthentication票证在服务器上不再有效。所以,是的,他们确实有不同的网络饼干,但他们每个饼干中都有相同的形式认证单。但是,其中一个是在未登录的情况下生成的

我们也发现了这篇文章,但无法确认这是否是原因

我会看看LiveHTTP告诉我什么,然后再报告。谢谢。

当然,如果这些图像(以及CSS和静态JS文件等)没有作为HTTPS提供,它们将受到ISP或其他代理(实际上是缓存)及其cookie的缓存

有一个缓存指令类似于这样:

Cache-control: no-cache="set-cookie,set-cookie2"
…它应该指示缓存不缓存“set cookie”响应头,但我不确定这是否得到广泛支持(尽管它是标准的)


如果可以,请避免在提供图像时设置cookie响应头(如果您不能完全控制会话管理,则可能不容易)。如果用户必须通过身份验证才能看到某些图像,那么这些图像无论如何都不应该被公开缓存。

很抱歉,我忘了提到所有流量都是通过端口443作为SSL传输的。我们计划删除图像的设置cookie。然而,当所有流量都通过SSL处理时,我们不太清楚这是如何发生的。

所有流量都是SSL。。。查看IIS日志一切都通过端口443进行。唯一正在设置的缓存是在前面提到的要公开的映像上。我们的假设是,这是导致问题的结果输出缓存。

您确定页面上没有启用类似输出缓存的功能吗?

安装Fiddler以调查上述http请求可能会有所帮助。另外,确认cookies是相同的。处理程序或窗体身份验证系统是否使用静态对象引用?您的代码中可能有竞争条件。并且没有正确锁定您的资源。

所以,即使您的主页也是SSL?身份验证之前?…并且在SSL终止之前您没有自己的缓存?请编辑原始问题,添加此信息,然后删除这些帖子。原因是问题的答案是唯一应该放在问题下面的东西。如果您有更多信息,请编辑您的问题或对您的问题发表评论。您是否确定人员B确实获得了人员a的cookie?(你是否在跟踪这些请求的细节?)?可能是并发请求或其他类似问题导致线程问题。请编辑原始问题,添加此信息,然后删除这些帖子。原因是问题的答案是唯一应该放在问题下面的东西。如果您有更多信息,请编辑您的问题或对您的问题发表评论,除非这是问题的答案,否则请编辑您的问题,或直接对您评论的答案发表评论。有一个“添加注释”字段专门用于此目的。