0

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。

以下是解释正在发生的事情的步骤

  1. 我进入登录页面并输入用户名/密码。

  2. 代码使用以下代码发出身份验证 Cookie

    FormsAuthentication.SetAuthCookie(model.UserName, false);

  3. 用户被发送到受保护的页面,我可以在浏览器 Cookie 中确认为用户设置了有效的 .ASPXAUTH cookie。

  4. 我浏览了几个受保护的页面,一切似乎都按预期工作。

  5. 突然,当我尝试打开一个页面时,浏览器被一个过期的身份验证 cookie 切断。

    设置 Cookie:.ASPXAUTH=; expires=1999 年 10 月 11 日星期一 23:00:00 GMT;路径=/; 仅http;同一站点=松懈;

  6. 这会导致浏览器删除 .ASPXAUTH cookie,从而导致会话丢失。

我花了几个小时试图找出可能导致这种行为的原因,但没有运气。我见过其他人遇到类似的问题,但没有解决方案。

更新:两天后问题停止发生。在 Fiddler 中尝试调试后,检查 IIS 日志并在 Internet 上搜索类似问题。我认为这与使用安全 cookie 有关。我在网站上启用了安全 cookie 进行一些测试,然后很快恢复了更新。@Scott Hanselman 有一篇文章指出了这个方向,但在我的情况下,我没有手动设置 cookie。

自定义 ASP.NET FormsAuthentication 的奇怪超时

4

2 回答 2

0
      <authentication mode="Forms" >
      <forms name="NAME" loginUrl="YOUR_LOGIN_URL" timeout="3000"></forms>
  </authentication>

您可以在 Web.config 中添加这段代码

--notice 超时属性是从分钟

于 2021-01-28T15:04:06.747 回答
0

有两个因素会导致这个问题,一个是 IIS 设置,另一个是代码配置。这些不包括在您提供的信息中,因此我将它们全部列出以供您参考。

使用进程内会话模式会将数据存储在工作进程中,也就是当前的内存对象。如果应用程序在服务器上使用过多的内存,服务器会重新启动(或者应用程序池可能被回收)并且cookie为空。这需要您监控服务器或工作进程的内存变化(aspnet_wp.exe) .

如果您访问某个页面并且cookie为空,请检查是否Response.Cookies [string]在代码中使用。ASP.NET 会自动生成一个新的 cookie 覆盖旧的 cookie 并导致信息丢失。请使用Request.Cookies-Collection阅读cookies。

FormAuthentication cookie 使用IIS 上的MachineKey进行加密和解密。默认情况下,应用程序设置为自动生成机器密钥,应用程序恢复会生成一个新的密钥。如果您的应用程序使用网络农场或网络花园,并且应用程序处于负载平衡状态,则每个服务器都无法解密其他服务器中的加密 cookie,这也可能导致此问题。解决方法是在web.config中自定义MachineKey部分,即使应用池被回收,key也不会改变。

<system.web>
  <machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551" 
    decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3" 
    validation="SHA1" decryption="AES" /> 
</system.web>
于 2021-01-29T03:15:22.723 回答