检查身份validation票证到期而不影响它

我正在尝试实现一个Web应用程序项目,我的网页可以使用AJAX检查服务器的身份validation票证到期日期/时间。

我正在使用带有slidingExpiration的Forms身份validation。

我遇到的问题是我无法弄清楚如何在不重置的情况下检查值。 我创建了一个简单的页面 – CheckExpiration.aspx – 下面是代码背后的代码:

private class AjaxResponse { public bool success; public string message; public string expirationDateTime; public string secondsRemaining; public string issueDate; } protected void Page_Load(object sender, EventArgs e) { AjaxResponse ar = new AjaxResponse(); JavaScriptSerializer js = new JavaScriptSerializer(); if (HttpContext.Current.User.Identity.IsAuthenticated) { FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; string expiration = id.Ticket.Expiration.ToString(); TimeSpan timeRemaining = id.Ticket.Expiration - DateTime.Now; ar.success = true; ar.expirationDateTime = expiration; ar.issueDate = id.Ticket.IssueDate.ToString(); ar.secondsRemaining = timeRemaining.Minutes.ToString() + ":" + timeRemaining.Seconds.ToString(); } else { ar.success = false; ar.message = "User not authenticated"; } string output = js.Serialize(ar); Response.Write(js.Serialize(ar)); } 

我每秒都使用ajax在我的应用程序的Master页面中调用此页面。 超过认证到期的中途点,到期时间将重置。

我该如何防止这种行为? 我可以在请求的标题中做些什么吗?

为什么不将过期存储为您自己计算的会话变量? 您只需要获取id.Ticket.Expiration的值一次。 然后每次调用,从服务器获取值并相应地增加它,并将其存储回服务器。

http://msdn.microsoft.com/en-us/library/ms178581%28v=vs.85%29.aspx

伪代码:

 if(!Session.KeyExists("Expiration")) { Session["Expiration"] = id.Ticket.Expiration; } Session["TimeRemaining"] = Session["Expiration"] - DateTime.Now; // get all ajaxy here 

将CheckExpiration.aspx页面放在自己的应用程序中,并将其部署为主应用程序下的虚拟目录。 在该虚拟目录中,配置slidingExpiration = false。 您的代码将按原样运行,但在到达到期时间的一半时间内不会重新生成故障单。

这是我在快速本地项目中所做的,以validation它是否有效:

  1. 创建了一个新的Web应用程序AuthTest4,并将其配置为在路径/ AuthTest4中使用本地IIS服务器
  2. 进入IIS并更改/ AuthTest4的机器密钥设置以取消选中所有AutoGenerate / Isolate选项并生成自己的MachineKey。
  3. 创建一个空的Web应用程序ExpCheck并将CheckExpiration.aspx代码放入其中
  4. 配置ExpCheck Web应用程序以在虚拟目录/ AuthTest4 / ExpCheck中使用本地IIS
  5. 修改了ExpCheck应用程序的web.config,使其只显示如下所示的部分

ExpCheck web.config。 所有其他安全设置将从父虚拟目录级联下来。