FormsAuthentication 的 .ASPXAUTH cookie 遇到了一个奇怪的问题。我将一个 .NET 4.6.2 MVC5 项目迁移到使用 FormsAuthentication 的 .NET 4.8,除了 FormsAuthentication 发出的身份验证 cookie 之外,一切似乎都按预期工作。
如果我使用开发人员工具并在浏览器中浏览 cookie,我可以成功登录应用程序。我可以看到浏览器设置了适当的 .ASPXAUTH cookie 以及 max-age=session 和 path=/。到目前为止,这一切都按预期工作,一切都很好。如果我开始浏览应用程序中的不同页面,我会突然被踢到登录页面。
通过 Fiddler 检查 IIS 和浏览器之间的流量表明应用程序会随机返回过期的身份验证 cookie,它会覆盖有效的 cookie。这会导致强制注销并丢弃会话。
这就是我的 web.config 中的内容。
<authentication mode="Forms">
<forms slidingExpiration="true" name=".ASPXAUTH" loginUrl="~/Login" defaultUrl="~/default" timeout="15"/>
</authentication>
<sessionState mode="InProc" cookieName=".SESSIONID" timeout="15"/>
<anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUS" cookieTimeout="1440"/>
- 网站托管在运行 Windows 10 Professional、IIS 10 的 localhost 中
- 我查看了应用程序池事件日志,它只是由于不活动而关闭。
由于不活动,服务应用程序池“mywebsite.com”的进程 ID 为“10832”的工作进程已关闭。应用程序池超时配置设置为 20 分钟。需要时将启动一个新的工作进程。
- 我们不会在登录表单旁边的任何地方手动重新发布身份验证 cookie。
以下是解释正在发生的事情的步骤
我进入登录页面并输入用户名/密码。
代码使用以下代码发出身份验证 Cookie
FormsAuthentication.SetAuthCookie(model.UserName, false);
用户被发送到受保护的页面,我可以在浏览器 Cookie 中确认为用户设置了有效的 .ASPXAUTH cookie。
我浏览了几个受保护的页面,一切似乎都按预期工作。
突然,当我尝试打开一个页面时,浏览器被一个过期的身份验证 cookie 切断。
设置 Cookie:.ASPXAUTH=; expires=1999 年 10 月 11 日星期一 23:00:00 GMT;路径=/; 仅http;同一站点=松懈;
这会导致浏览器删除 .ASPXAUTH cookie,从而导致会话丢失。
我花了几个小时试图找出可能导致这种行为的原因,但没有运气。我见过其他人遇到类似的问题,但没有解决方案。
更新:两天后问题停止发生。在 Fiddler 中尝试调试后,检查 IIS 日志并在 Internet 上搜索类似问题。我认为这与使用安全 cookie 有关。我在网站上启用了安全 cookie 进行一些测试,然后很快恢复了更新。@Scott Hanselman 有一篇文章指出了这个方向,但在我的情况下,我没有手动设置 cookie。