检查身份验证票过期而不影响它

Posted

技术标签:

【中文标题】检查身份验证票过期而不影响它【英文标题】:Check authentication ticket expiration without affecting it 【发布时间】:2012-10-01 05:33:33 【问题描述】:

我正在尝试实现一个 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 从应用程序的主页面调用此页面。在身份验证过期的中间点之后,过期将被重置。

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

【问题讨论】:

检查这是不是类似的东西或者你的问题是不同的?...dotnetmonster.com/Uwe/Forum.aspx/asp-net-security/2316/… 我认为您链接到的这篇文章是有人对 .net 的默认行为有问题。我不在乎这种行为,因为如果您保持空闲状态,那么在您尝试做某事之前,您不会知道您已在服务器级别注销。我正在尝试做一些对用户更友好的东西,在那里你会被告知你即将被注销。我也不想只依赖进入页面时设置的 javascript 计时器,因为可以从另一个选项卡刷新身份验证。 【参考方案1】:

为什么不将过期时间存储为您自己计算的会话变量?您只需要获取一次 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

【讨论】:

【参考方案2】:

将您的 CheckExpiration.aspx 页面放在它自己的应用程序中,并将其部署为主应用程序下的虚拟目录。在该虚拟目录中,配置slidingExpiration=false。您的代码将按原样工作,但在到期前的一半时间以下时不会重新生成票证。

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

    创建了一个新的 Web 应用程序 AuthTest4 并将其配置为使用路径 /AuthTest4 中的本地 IIS 服务器 进入 IIS 并更改 /AuthTest4 的机器密钥设置以取消选中所有自动生成/隔离选项并生成自己的机器密钥。 创建了一个空的 Web 应用程序 ExpCheck 并将您的 CheckExpiration.aspx 代码放入其中 将 ExpCheck Web 应用程序配置为使用虚拟目录 /AuthTest4/ExpCheck 中的本地 IIS 修改 ExpCheck 应用程序的 web.config 以仅包含如下所示部分

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

<system.web>
  <authentication mode="Forms">
   <forms slidingExpiration="false" />
  </authentication>
</system.web>

【讨论】:

以上是关于检查身份验证票过期而不影响它的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 身份验证会话未过期 [重复]

Django Rest Framework 避免身份验证 JWT

尝试进行身份验证时 JWT 令牌过期?

MERN-stack使用react-router用户身份验证而不使用redux

在 RESTful API 中存储身份验证令牌的位置?

如果身份验证令牌在帐户身份验证器中过期,则使用刷新令牌