在不活动后终止表单身份验证会话

时间:2013-06-10 22:16:34

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

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

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

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

3 个答案:

答案 0 :(得分:0)

您应该能够在表单身份验证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的类来为身份验证票证添加额外的验证。这里有很多灵活性可供您利用。

答案 1 :(得分:0)

为何与Cookie混淆?只需设置超时即可完成工作

如下所示。

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

答案 2 :(得分:0)

我建议的解决方案是利用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将过期。