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 我也对涉及服务器处理的解决方案持开放态度。希望客户端解决方案能够减少对我们现有应用程序的修改。
嗯..这是一个棘手的问题 - 只是喜欢它!
为什么它很棘手?因为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)
再说一遍——这并不漂亮,但很合乎逻辑——对于两种不同的行为,我们使用两种不同的配置来定义每种行为应该如何反应。任何其他解决方案都将请求自定义实现,就我而言 - 您首先要避免这种情况。
就个人而言:请在这里分享您的最终解决方案,以帮助将来的其他人。谢谢
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |