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

时间:2013-09-23 12:38:53

标签: c# asp.net session

是否可以确定日期&使用表单身份验证时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进行交互而不会向网络服务器发回任何回复或请求。

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

1 个答案:

答案 0 :(得分:3)

我有类似的问题。在我的情况下,由于用户数量较少,我选择在页面上轮询ajax调用以回调服务器并检查过期票证时获得更好的用户体验。您可以通过调整以下代码并在页面中包含过期信息,并在客户端javascript中跟踪时间,如果您不想使用ajax路径,则可以逃脱。

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

如果你去ajax路线,还有另一个问题。如果使用ajax调用本身,则必须停止更新非活动超时。您可以通过使用原始身份验证覆盖新的身份验证cookie来实现此目的。在你的ajax请求结束时。

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