MVC 5 中的扩展注销

jpW*_*ner 3 javascript authentication timeout ping client-side

根据用户的选择延长登录时间。

场景:ASP.NET MVC 5 Web 应用程序托管在 Azure WebApp 中,WebConfig 设置为在 60 分钟内没有向服务器发出任何请求时超时,如下所示

网络配置:

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="60" slidingExpiration="true" name="MYAUTHDV" cookieSameSite="None" requireSSL="true" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

在登录屏幕中,我们希望提供一个复选框,如果用户勾选它并登录,即使没有任何活动,网络应用程序也不应该在接下来的 12 小时内将其注销。

在此输入图像描述

到目前为止,我已经尝试在 _layoutpage.chtml 上运行一个 JavaScript 计时器,并在客户端及时注册一个本地存储时间值。JavaScript 计时器将每 20 分钟 ping 一次服务器以保持登录活动。由于浏览器、机器睡眠模式、硬盘关闭、互联网中断和其他未知原因等多种原因,这并不总是有效。还有一个我们必须克服的关于滑动过期与 JavaScript ping 的问题。https://learn。 microsoft.com/en-us/dotnet/api/system.web.security.formsauthentication.slidingexpiration?view=netframework-4.8 我也对涉及服务器处理的解决方案持开放态度。希望客户端解决方案能够减少对我们现有应用程序的修改。

ymz*_*ymz 5

嗯..这是一个棘手的问题 - 只是喜欢它!

为什么它很棘手?因为ASP.NET config规则大多是静态的并且适用于整个项目。这就是为什么默认超时60 minutes作为一般策略会影响每个用户。

最直接的解决方案(不触及您的 Web 应用程序内部)将定义 2 种表单 - 一种用于普通用户(将在 1 小时后启动),另一种具有延长超时的表单。当然 - 这也会使 UI 发生变化(您需要使用将用户重定向到不同表单的链接,而不是复选框)。这不是一个非常优雅的解决方案,但它会起作用

问题是每个配置部分只能有一个<forms>标签(这很奇怪 - 指令本身是复数)。在这篇文章之后,有一种方法可以通过声明具有 2 个不同工作文件夹的 2 个部分来绕过此问题。

所以是的 - 优雅的解决方案已经不在讨论范围内,但它仍然是可能的,并且无需触摸即可工作ASP.NET internals- 我认为这是积极的。整体解决方案可能如下所示

  • 使用扩展登录屏幕创建另一个文件夹(在您的解决方案下)
  • 在文件下web.config定义2个不同的工作文件夹(使用<location>指令)
  • 使用链接将用户从标准登录屏幕重定向到扩展登录屏幕
  • 使用扩展屏幕完成登录后 - 重定向到您的主页(例如仪表板或类似的内容)

web.config文件应如下所示:

<location path="/{MAIN_FOLDER}">
    <system.web>
      <authentication mode="Forms">
         <forms loginUrl="~/Account/Login" timeout="60" slidingExpiration="true" name="MYAUTHDV" cookieSameSite="None" requireSSL="true" />
      </authentication>
    </system.web>
</location>

<location path="/{EXTENDED_LOGIN_FOLDER}">
    <system.web>
      <authentication mode="Forms">
         <forms loginUrl="~/ExtendedLogin" timeout="720" slidingExpiration="true" name="MYAUTHDV" cookieSameSite="None" requireSSL="true" />
      </authentication>
    </system.web>
  </location>
Run Code Online (Sandbox Code Playgroud)

再说一遍——这并不漂亮,但很合乎逻辑——对于两种不同的行为,我们使用两种不同的配置来定义每种行为应该如何反应。任何其他解决方案都将请求自定义实现,就我而言 - 您首先要避免这种情况。

就个人而言:请在这里分享您的最终解决方案,以帮助将来的其他人。谢谢