Asp.net:实现自动注销功能

Posted

技术标签:

【中文标题】Asp.net:实现自动注销功能【英文标题】:Asp.net: Implementing Auto-Logout functionality 【发布时间】:2010-10-17 02:07:16 【问题描述】:

我必须在我的一个项目中实现自动注销功能,但我不知道从哪里开始寻找想法,但 SO

如果用户会话已过期,我需要应用程序将用户重定向到登录页面。 请告诉我应该采取什么方法来解决此要求。

问题陈述: 如果用户在任何给定的登录实例中离开系统超过 n 分钟,系统应自动将其注销。

【问题讨论】:

【参考方案1】:

与问题一样多地讨论 cmets,我不确定您是否想要在一段时间后将用户注销,而不管活动如何,或者只是在一段时间不活动之后。

如果您乐于使用标准的ASP.NET mechanisms,无需任何主要工作即可为您完成:

设置您的membership provider。

确保您的 authentication section 定义了一个 loginUrl:

<authentication mode="Forms">
  <forms loginUrl="login.aspx" />
</authentication>

您可以使用forms element 上的“超时”属性设置默认 30 分钟以外的超时:

<authentication mode="Forms">
  <forms loginUrl="login.aspx" timeout="15"/>
</authentication>

这将在用户在您的网站上闲置 15 分钟后注销(无论是在浏览器打开且没有 javascript“心跳”的情况下,或者如果他们在另一个网站上花费了 15 分钟)。

拒绝匿名用户访问

<authorization>
  <deny users="?" />
</authorization>

然后确保所有使用location Element:的用户都可以访问您的登录、注册和可能忘记的密码页面

<location path="Logon.aspx">
  <system.web>
    <authorization>
      <allow users="?"/>
    </authorization>
  </system.web>
</location>
<location path="Register.aspx">
  <system.web>
    <authorization>
      <allow users="?"/>
    </authorization>
  </system.web>
</location>
<!-- etc -->

这样,当用户的身份验证 cookie 过期时,他们将被重定向到表单页面的 loginUrl 元素中指定的 URL。


如果您不使用标准的 ASP.NET 机制,那么您最好实现“基页”类型模型。

创建一个继承自 System.Web.UI.Page 的新类,它将检查用户的登录状态,如果他们没有登录/超时,则将他们重定向到您的登录页面。

在要锁定的页面中,您不是从 System.Web.UI.Page 继承,而是从基本页面类继承(这种设置的示例以执行类似操作 - 检查每个页面上的设置) 可见my answer here


您的登录页面可能需要在其中包含一些破坏框架的 JS 才能跳出 iFrame:

if (top!=self.parent)
  top.location=self.parent.location;


或者您是说通过按“返回”他们仍然可以通过浏览器缓存看到您的页面?在这种情况下,您需要在每个页面上使用 Cache 标头:

Response.Cache.SetCacheability(HttpCacheability.NoCache);

好的,在这种情况下,您还需要一个 JS 计时器对象来执行 Location.Replace 到您的登录页面 - 在每个页面的用户控件中(或者更好的是,在您的母版页面中) n分钟后自动重定向用户:

<script type="text/javascript">
  setTimeout('location.Replace("/login.aspx")', 900000);
</script>

时间以毫秒为单位,因此这将在 15 分钟内移动它们,无需为此准备整个 jQuery 框架。

您可能还想查看元刷新标签:

<meta http-equiv="refresh" content="900;url=http://example.com/login.aspx" />

这将强制浏览器在 15 分钟后刷新到登录页面(以秒为单位)。

【讨论】:

这是我的概率声明:如果用户在任何给定的登录实例中离开系统超过 n 分钟,系统应自动将其注销。如果所提问题的框架不正确,我深表歉意。 如果您使用表单身份验证,请将超时属性设置为“n”分钟,并且他们的身份验证令牌将在“n”分钟不活动后过期 - 浏览器窗口保持打开状态,或者他们徘徊到那个时候去另一个网站。 你确定吗?这通常是一种危险的做法。除非您的应用程序非常动态,否则用户通常会觉得您的页面是静态的。因此,他们认为他们的工作或他们正在查看的信息是“安全的”,与他们的身份验证状态无关,如果让应用程序通过定时重定向将其丢弃是非常不愉快的。 根据应用程序的性质,它可能很有用。如果它有一个复杂的表格,用户填写后才发现他们在提交时才发现他们已注销,这可能会令人沮丧。我已经使用元刷新标签集在会话到期后重定向到一个页面,告诉用户他们已被注销。但是,随着选项卡式浏览器的出现,您需要考虑到它们可能会在另一个选项卡中为您的站点打开另一个活动窗口,因此可能首先需要某种 ajax 回调。 但是使用 ajax 回调,您需要确保保持会话活动的不是回调本身。【参考方案2】:

这是通过以下方式实现的:

1) 将每个请求(服务器和 ajax,不包括会话检查 ajax 请求)的时间戳保存到服务器到会话变量中。

2) 通过 JS 函数使用 ajax 频繁轮询服务器,检查会话时间戳和 ajax 请求时间之间的时间差异是否大于会话超时 val 然后注销当前用户并返回该 ajax 请求的布尔值。

3) 如果返回的布尔值为真,则将当前页面重定向到登录页面。

【讨论】:

您应该将此标记为答案,然后以节省人们花在上面的时间【参考方案3】:

由于您不知道从哪里开始,您可能会发现这篇 4guys 文章很有用:http://www.4guysfromrolla.com/webtech/110701-1.shtml

编辑

如果您想在经过一段已知的时间(即您的会话到期时间)后重定向到某个网址,听起来像 jQuery timer 可能会很有用。

希望这会有所帮助。

【讨论】:

我知道身份验证有效;那你怎么帮我?请理解,用户不会与他的网站进行交互,并且当会话到期时,应用程序仍会将其重定向到登录页面!它将成为客户端的事情! 也许考虑重写你的问题,让愿意花时间帮助你的人更清楚。 我认为自动注销这个词是不言自明的;估计不是! 不,一点也不 :) 您还有其他要求。

以上是关于Asp.net:实现自动注销功能的主要内容,如果未能解决你的问题,请参考以下文章

注销功能不适用于 ASP.NET 标识

注销功能不适用于 ASP.NET 标识

IdentityServer3 注销功能不适用于 ASP.NET Core 客户端

会话 Cookie,自动注销

是否可以为不活动实现自动注销功能?

ASP.net 2.2 MVC:注销