确定 ASP.NET 窗体身份验证何时过期


是否可以

确定使用表单身份验证时 ASP.NET 会话过期的日期和时间?

我想在会话即将到期时警告用户。没有会话状态,滑动过期已禁用。以下是一些 system.web 设置:

<authentication mode="Forms">
  <forms defaultUrl="Default.aspx" loginUrl="Login.aspx" requireSSL="false" enableCrossAppRedirects="true" cookieless="AutoDetect" timeout="2" slidingExpiration="false"/>
</authentication>
<sessionState mode="Off"/>
会话

的超时/生存期很容易确定,但如果用户在会话窗口中刷新页面,则在重新加载时将生存期值添加到日期时间将不准确。

使用以加密FormsAuthenticationTicket票证作为其值的身份验证cookie,可以对其进行解密以获取到期日期时间。

尽管可能会进行某些 AJAX 调用,但用户可能会与 UI 交互,而无需向 Web 服务器发出任何回发或请求。

关于如何在不使用 cookie 的情况下实现此类行为的任何想法?

我也有类似的问题。就我而言,鉴于用户数量较少,我选择在页面上轮询 ajax 调用以回调服务器并检查过期票证来获得更好的用户体验。如果您不想走 ajax 路线,您可以通过调整以下代码并通过 http 在页面中包含到期信息并在客户端 javascript 中跟踪时间。

        if (User.Identity.IsAuthenticated)
        {
            var identity = (FormsIdentity)User.Identity;    
            viewModel.UtcInactivityExpiryDate = identity.Ticket.Expiration.ToUniversalTime();                
        }

如果你走ajax路线,还有另一个陷阱。如果您正在使用 ajax 调用,则必须阻止 ajax 调用本身续订不活动超时。您可以通过用原始 cookie 覆盖新的身份验证 cookie 来执行此操作。在您的 Ajax 请求结束时。

            var requestCookie = HttpContext.Current.Request.Cookies[".ASPXAUTH"];
            if (requestCookie != null)
            {
                HttpContext.Current.Response.Cookies.Add(requestCookie);
            }

最新更新