我正在尝试实现一个Web应用程序项目,我的网页可以使用AJAX检查服务器的身份验证票证到期日期/时间。
我正在使用带有slidingExpiration的表单身份验证。
我遇到的问题是我无法弄清楚如何在不重置的情况下检查值。我创建了一个简单的页面 - 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页面中调用此页面。超过身份验证到期的中途点,到期时间将重置。
如何防止此行为?我可以在请求的标题中做些什么吗?
答案 0 :(得分:0)
为什么不将过期存储为您自己计算的会话变量?您只需要获取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
答案 1 :(得分:0)
将CheckExpiration.aspx页面放在自己的应用程序中,并将其部署为主应用程序下的虚拟目录。在该虚拟目录中,配置slidingExpiration = false。您的代码将按原样运行,但在到达到期时间的一半时间内不会重新生成故障。
以下是我在快速本地项目中所做的工作,以验证其是否有效:
ExpCheck web.config。所有其他安全设置将从父虚拟目录级联下来。
<system.web>
<authentication mode="Forms">
<forms slidingExpiration="false" />
</authentication>
</system.web>