1

使用表单身份验证时,是否可以确定 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 的情况下实现此类行为的任何想法?

4

1 回答 1

2

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

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

如果你走 ajax 路线,还有另一个问题。如果您正在使用一个,则必须阻止 ajax 调用本身更新不活动超时。您可以通过用原始身份验证 cookie 覆盖新的身份验证 cookie 来做到这一点。在您的 ajax 请求结束时。

            var requestCookie = HttpContext.Current.Request.Cookies[".ASPXAUTH"];
            if (requestCookie != null)
            {
                HttpContext.Current.Response.Cookies.Add(requestCookie);
            }
于 2015-03-06T02:52:41.520 回答