【问题标题】:ASP.NET Automatic logoutASP.NET 自动注销
【发布时间】:2013-04-13 18:57:28
【问题描述】:

我正在和另外 4 个人一起做一个小组项目。我们正在使用嵌入 c# 的 MVC4 中的 ASP.NET 设计一个工作亭。

我正在努力让系统在用户空闲 10 分钟后将其注销。我需要一些关于如何开始编写系统以注销用户的方法的帮助。

【问题讨论】:

  • 如果您使用的是 ASP.NET 表单身份验证,那么它将通过 web.config 中的设置为您处理。
  • 跟踪用户活动,如果他们提出的请求超出您的时间戳,他们需要重新登录。如果启用,IIS 中的回收器会负责其余的工作。

标签: c# asp.net asp.net-mvc


【解决方案1】:

如果您不使用“Windows 身份验证”,这至少取决于您可以通过 web.config 控制的会话超时:

<configuration>
    <system.web>
        <sessionState timeout="10" />
    </system.web>
</configuration>

由于大多数技术在某种程度上依赖于会话,因此这在大多数情况下都有效。

【讨论】:

  • 如果他没有使用 Forms Authentication 或 Windows Authentication,那么他做错了。他将很容易受到会话固定攻击。 software-security.sans.org/blog/2009/06/24/…
  • @JeowLiHuan,可以实现甚至改进表单身份验证的功能,而无需实际使用它。然而,关键是,我没有就使用什么技术提出任何建议,因为这不是问题的一部分。我刚刚说过,只要身份验证以某种方式依赖于会话,放弃会话就会注销用户,大多数解决方案都是如此。 Windows 身份验证除外。
【解决方案2】:

您正在寻找的答案是 AliK 建议的答案。您想在 web.config 中设置自动超时,以便在一定的空闲时间后自动注销用户并将其重定向到登录页面。

<authentication mode="Forms">
   <forms loginUrl="Login.aspx" protection="All" timeout="1" slidingExpiration="true">
   </forms>
</authentication>

如果我没记错的话,超时值以分钟为单位,而不是秒或毫秒。此外,滑动到期意味着每次您在网站上执行操作时都会重置超时。因此,如果您有 5 分钟的超时,并且您在单击网站上的按钮之前闲置了 4 分钟,那么在单击按钮后,您将获得一个新的 5 分钟超时。

【讨论】:

  • 我试过了,它不会自动重定向用户。我喜欢 Vinny 在 Applicaiton_BeginRequest 中添加 Refresh 标头的建议,但这是否意味着我必须为此添加 global.asax?
【解决方案3】:

如果您使用 FormsAuthentication,我会这样做:

控制器动作:

public ActionResult CheckLogin()
{
    if (Request.Cookies["CookieName"] == null) return Json(0, JsonRequestBehavior.AllowGet);
    var cookie = Request.Cookies["CookieName"].Value;
    var ticket = FormsAuthentication.Decrypt(cookie);
    var secondsRemaining = Math.Round((ticket.Expiration - DateTime.Now).TotalSeconds, 0);
    return Json(secondsRemaining, JsonRequestBehavior.AllowGet);
}

每个页面或布局页面上的Jquery:

<script>
    $(function () {
        setTimeout(doStuff, 1000);
    });
    function doStuff() {
        $.ajax("/CheckLogin").done(function (data) {
            if (data <= 60) {
                startLogout(data);
            } else {
                setTimeout(doStuff, 1000);
            }
        });
    }

    function startLogout(seconds) {
        var countdown = setInterval(function () {
            //Show something here
            if (count == 0) {
                clearInterval(countdown);
                //Do something here
            }
            seconds--;
        }, 1000);
    }
</script>

【讨论】:

    【解决方案4】:

    如果您需要让他们自动注销,请从 Linus Caldwell 的设置 web.config 会话超时的建议开始。他的示例显示 30 分钟,因此您只需将其更改为 10 分钟。但是,用户不会知道他们已注销,直到他们实际尝试请求某些服务器资源。要让这种情况自动发生,您可以采取多种方式。这两种方式都涉及在超时期限到期后自动刷新页面。一种方法是使用 javascript 计时器。另一种是为每个页面添加一个刷新标题。

    <script type="text/javascript">
    var seconds = 60 * 11;// set timer for 11 minutes (1 minutes after session expires)
    countdown();
    function countdown(){
       seconds--;
       if (seconds <= 0){
              window.location.reload(); // force a refresh.
       }else{
              setTimeout('countdown()', 1000);
       }
    }
    </script>
    

    另一种方式是在你的 global.asax 中:

    protected void Application_BeginRequest()
    {
        Response.Headers.Add("Refresh", Convert.ToString(Session.Timeout * 11));
    }
    

    【讨论】:

      【解决方案5】:

      如果您所说的空闲是指用户没有鼠标和键盘事件,并且我正确理解您的要求,您应该检查 jquery-idleTimeout 插件。

      另一个不错的是jQuery idleTimer Plugin

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-17
        • 2011-07-19
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 2013-05-22
        相关资源
        最近更新 更多