我们有一个使用本机表单身份验证和会话功能的 ASP.NET 4.5 WebForms 应用程序。两者都有 20 分钟的超时时间和滑动到期。
想象以下场景。用户在我们的应用程序中工作了一段时间,然后继续做一些其他事情,让我们的应用程序空闲 20 分钟。然后用户返回到我们的应用程序以编写报告。但是,当用户尝试保存时,他/她会被视为登录屏幕,并且报告会丢失。
显然,这是不希望的。我们希望在身份验证或会话到期时将浏览器重定向到登录页面,而不是这种情况。为了实现这一点,我们构建了一个 Web Api 服务,可以调用它来检查是否是这种情况。
public class SessionIsActiveController : ApiController
{
/// <summary>
/// Gets a value defining whether the session that belongs with the current HTTP request is still active or not.
/// </summary>
/// <returns>True if the session, that belongs with the current HTTP request, is still active; false, otherwise./returns>
public bool GetSessionIsActive()
{
CookieHeaderValue cookies = Request.Headers.GetCookies().FirstOrDefault();
if (cookies != null && cookies["authTicket"] != null && !string.IsNullOrEmpty(cookies["authTicket"].Value) && cookies["sessionId"] != null && !string.IsNullOrEmpty(cookies["sessionId"].Value))
{
var authenticationTicket = FormsAuthentication.Decrypt(cookies["authTicket"].Value);
if (authenticationTicket.Expired) return false;
using (var asdc = new ASPStateDataContext()) // LINQ2SQL connection to the database where our session objects are stored
{
var expirationDate = SessionManager.FetchSessionExpirationDate(cookies["sessionId"].Value + ApplicationIdInHex, asdc);
if (expirationDate == null || DateTime.Now.ToUniversalTime() > expirationDate.Value) return false;
}
return true;
}
return false;
}
}
客户端每 10 秒调用一次此 Web Api 服务,以检查身份验证或会话是否已过期。如果是这样,脚本会将浏览器重定向到登录页面。这就像一个魅力。
但是,调用此服务会触发身份验证和会话的滑动到期。因此,本质上,创建永无止境的身份验证和会话。我在服务开始时设置了一个断点,以检查它是否是我们自己的函数之一触发它。但事实并非如此,它似乎发生在 ASP.NET 更深处的某个地方,在服务执行之前。
- 有没有办法为特定请求禁用触发 ASP.NET 的身份验证和会话滑动到期?
- 如果没有,解决这种情况的最佳做法是什么?