我不太确定这是否应该归于 SuperUser.com。我还考虑过 ServerFault.com 和 StackOverflow.com,但总的来说,我认为它应该归于此处?
我们托管了一个网站,该网站的代码相同,但可响应多个域名。12 月 28 日(网站未部署任何更改),部分用户突然无法登录,即使输入了正确的凭据,登录页面仍会再次显示空白。此问题仍在继续。
在远程控制受影响用户的电脑后,我们发现以下情况:
- 此问题影响 Internet Explorer 9。
- 用户可以从同一台机器上在 Chrome 上登录。
- 用户可以使用 IE9 从私人浏览器会话登录。
- 如果该网站被添加到受信任的站点安全区域,则用户就可以登录。
- 用户无法从安全模式(以 启动
iexplore -extoff
)下的 IE 会话登录。 - 只有一个网站响应的主机名阻止登录,另一个主机名上的相同用户帐户工作正常(请注意,这是在服务器端运行的相同代码和数据库),即使该网站不在受信任的站点区域。
失败情况下的一系列HTTP请求:
- 对受保护页面发出 GET 请求,向登录页面返回 302 FOUND 响应。
- 对登录页面发出 GET 请求。
- POST 到登录页面,包含凭证,返回重定向到受保护的页面。
- 对受保护的页面发出 GET 请求...由于某种原因,身份验证失败,浏览器被重定向到登录页面,如步骤 1 所示。
其他信息:
- 操作系统是Windows 7旗舰版。
- AV 系统是 AVG Internet Security 2012。
我能想到很多事情可以可能会出错,但在每种情况下,上述发现之一都与理论不相容。
知道是什么原因导致登录失败吗?
2012 年 1 月 6 日更新
增强日志记录显示该.ASPXAUTH
cookie 正在步骤 3 中设置。其到期日期为未来 28 天、其路径为/
、域为mysite.com
、其值是加密表单票证,正如预期的那样。
但是,在步骤 4 中,Web 服务器没有接收到该 cookie。在步骤 4 中,其他 cookie 都被呈现给服务器,但唯独缺少了这个 cookie。
我看到 Cookie 通常以句点开头的域名设置,但我的不是。应该是.mysite.com
而不是mysite.com
?但是,如果这是错误的,它可能会对所有用户产生影响?
答案1
我在更新中对未返回到服务器的 cookie 的分析是错误的。在我的日志代码运行之前的某个时间点,该 cookie 已从服务器端的 cookie 集合中删除。
使用Wireshark,我确定实际上,二向服务器发送了 cookie的副本.ASPXAUTH
,其中一个无效,另一个有效。从技术上讲,cookie 的顺序是不确定的,所以我认为这会影响那些浏览器首先发送无效 cookie 的人……ASP.NET 根本没有考虑第二个有效的 cookie。
如上所述,有问题的 cookie 是 ,.ASPXAUTH
这是 .NET 身份验证 cookie 的默认名称。我们认为它存在两个副本,因为它可能在过去以不同的域发送过(一次是 ,www.mysite.com
另一次是.mysite.com
)。
最简单的解决方案,效果很好,就是通过设置以下内容来更改身份验证 cookie 的名称Web.config
:
<authentication mode="Forms">
<forms name="SOMEOTHERCOOKIENAME" />
</authentication>
然后,只需确保新的 cookie 仅发送与给定请求匹配的单个值!
答案2
知道是什么原因导致登录失败吗?
饼干。
- 私人模式可能有一组单独的 cookie(否则它很难是私人的)
- 不同的浏览器有不同的 Cookie
- Cookies 通常特定于网站域名。
这些都和你的问题描述一致。
更新:
检查相关安全区域(Internet、本地、受信任、受限)的 Cookie 设置。
在 IE8 中:Tools, Internet Options, Privacy, Sites
mysite.com 是否可能在相关区域中被阻止?检查你的实际 Cookie
在 IE8 中:Tools, Internet Options, General, Browsing History, Settings, View Files
查找cookie:username/mysite.com/
检查非默认的 Cookie 处理设置
它们可能会阻止“第三方”cookie(如果适用)
可能会选择提示接受/拒绝新的 cookie。
你说“如果该网站被添加到受信任的站点安全区域,用户就可以登录。”这意味着 mysite.com 可能会在通常适用的其他区域之一中被阻止mysite.com
。
答案3
我遇到过非常类似的事情,IE 或 Chrome 中没有设置 ASP.NET 身份验证 cookie,但奇怪的是 Firefox 中却设置了(我仍然无法解释为什么会这样)。
对我来说,问题在于服务器时间不正确,它早了 30 分钟。因此,当我在 9:50 登录网站时,服务器将 Cookie 的过期时间设置为 10:10,但我的电脑上的时间是 10:20,因此 Cookie 已经过期。更新服务器上的时间解决了这个问题
答案4
在 Explorer 的 Internet 选项、常规、浏览历史记录、设置中,您可以尝试将“检查新版本...”设置从“自动”(第三选择)更改为“每次访问...”(第一选择)。
我遇到过几乎相同的问题,这个解决方法有效。一直没找到问题出在哪里...
另外(但我不认为这是你的情况),检查服务器和客户端之间的时钟差异。