【问题标题】:kill forms authentication session after inactivity不活动后终止表单身份验证会话
【发布时间】:2013-06-10 22:16:33
【问题描述】:

我有一个使用表单身份验证的 asp.net mvc 4 应用程序。

我想设置网站 30 分钟的时间限制,如果登录的人在这段时间内(不是登录后的时间)不活动,他们会自动注销。我目前坚持使用 cookie,并且没有会话状态。

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 如果您使用 cookie,将 cookie 到期时间设置为最后一次访问后 30 分钟是否足够?
  • 这可以用forms auth cookie来完成吗?我该怎么问?
  • 应该是。唔。我通常这样做,但我觉得有一种比我通常做的更简单的方法,但我会尝试编写一些代码作为答案。
  • 您如何使用 FormsAuthentication 类?如果您使用默认值,您只需在 web.config 中设置超时,FormsAuthentication 类将使用它。但是,如果您要创建自定义票证,则必须通过设置票证和 cookie 的属性手动设置超时。
  • 谢谢你,但是我希望时间段基于不活动而不是基于他们第一次登录的时间。知道如何做到这一点吗?

标签: security asp.net-mvc-4 forms-authentication


【解决方案1】:

您应该能够在表单身份验证 cookie 上定义到期日期,使其在创建后 30 分钟内到期(大概是在对您的应用进行访问时)。

我通常首先创建一个FormsAuthenticationTicket

var ticket = new FormsAuthenticationTicket {
    1,  // a version number; do with it as you like
    "my ticket name",
    DateTime.Now,   // set when the cookie is valid from
    DateTime.Now.Add(FormsAuthentication.Timeout), // and when it expires
    false,  // is the cookie persistent?
    "cookie data"  // the actual "value" of the cookie;
                   // I normally put in sufficient stuff to recreate
                   // the principal + identity on request
};

// encrypt that
var token = FormsAuthentication.Encrypt(ticket);

然后您可以继续实际创建 cookie

var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, token) {
    // expiry, again (there must be something redundant here)
    Expires = DateTime.Now.Add(FormsAuthentication.Timeout),
    // add this if you need it
    HttpOnly = true
};

// then flush that in with the response
HttpContext.Current.Response.Cookies.Add(cookie);

FormsAuthentication.Timeout 的值可以在您的web.config 中定义,也可以在您的代码中的某处进行设置。默认值为 30 分钟,因此如果您没有进行任何更改,应该没问题。

<system.web>
    <!-- ... -->
    <authentication mode="Forms">
        <forms timeout="30" ... >
            <!-- ... -->
        </forms>
    </authentication>
</system.web>

我觉得应该有一种更简单的方法来做到这一点,但我喜欢用上面的方法来处理(相对)细粒度的细节。那,或者我只是不必要地无知。

根据我的应用程序的需要,我可以通过制作一个专门作为一种 DTO 传递给FormsAuthenticationTicket 的类来为身份验证票证添加额外的验证。这里有相当多的灵活性供您利用。

【讨论】:

  • 谢谢你,但是我希望时间段基于不活动而不是基于他们第一次登录的时间。知道如何做到这一点吗?
  • 如果不活动,你的意思是服务器调用,然后在每次发送请求时更新 cookie。如果你所说的不活动是指移动鼠标指针,那是完全不同的香蕉。
【解决方案2】:

为什么要与 cookie 混淆?只需设置超时即可完成工作

如下所示。

<authentication mode="Forms">
      <forms loginUrl="~/Test/LogOn" timeout="30" defaultUrl="~/Test/Index" />
</authentication>

【讨论】:

  • 谢谢你,但是我希望时间段基于不活动而不是基于他们第一次登录的时间。知道如何做到这一点吗?
  • 超时仅在用户处于非活动状态 30 分钟时发生。不是在 30 分钟的登录时间之后。所以这应该有效。试一试
【解决方案3】:

我建议的解决方案是利用 FormsAuth 的“slidingExpiration”属性:

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="20" slidingExpiration="true"/>
</authentication>

另外,要在 Login() 上创建持久 cookie:

FormsAuthentication.SetAuthCookie(model.UserName, true);

这样,您将有一个 20 分钟不活动的滑动窗口,这意味着用户执行的每个操作都会将过期窗口再向前移动 20 分钟。因此,如果真正不活动 20 分钟,cookie 就会过期。

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 2013-04-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2014-06-12
    • 2012-02-29
    相关资源
    最近更新 更多