如何在asp.net formsAuthentication中超时用户

时间:2009-11-08 02:31:26

标签: .net asp.net asp.net-mvc web-config

我想知道如果用户在10分钟之后没有做任何请求,如果会话被终止并且他们被注销,我该如何为用户设置超时。

我的webconfig中有这个

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn"
                   protection="All"
                   timeout="20160"
                   path="/"
                   requireSSL="false"
                   slidingExpiration="false"
                   defaultUrl="default.aspx"
                   cookieless="UseDeviceProfile"
                   enableCrossAppRedirects="false" />
</authentication>

我被告知要将超时设置为“20160”,因为如果他们选中“保持登录2周”,我想要登录2周。我还确保在我的Cookie Cookie中启用IsPersistent。

那么我需要设置另一个超时吗?由于在我的网站上一段时间不活动后,它不再起作用。我还没有计时,但是如果我离开并在10分钟后回来并尝试在我的网站上做一些事情,比如保存它将无效。所以看起来我的连接被杀了或什么的。我必须注销,重新登录然后才能运行

修改

这就是我制作饼干的方式

 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(version,userName,DateTime.UtcNow,DateTime.UtcNow.AddDays(14),createPersistentCookie,userData,"/");
            string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
            HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            authCookie.Path = "/";
            if (createPersistentCookie == true)
            {
                authCookie.Expires = DateTime.UtcNow.AddDays(14);
            }
            HttpContext.Current.Response.Cookies.Add(authCookie);

当我在webconfig中设置会话状态时,我的网址就有了这个

(S(gkvkze55zfzzee45wj34byee))

我宁愿在我的代码中没有这个讨厌的行。

3 个答案:

答案 0 :(得分:3)

另一个答案,只是为了说明如何使用web.config中的值创建cookie,而不是在代码中对它们进行硬编码。

首先,考虑是否需要所有额外选项。最简单的方法是在web.config中设置所有内容

FormsAuthentication.RedirectFromLoginPage("Bob", isPersistent)

但是,如果您需要将UserData添加到故障单,则必须创建自己的。请注意我们如何使用web.config中的值而不是硬编码值。

/// <summary>
/// Create a New Forms Authentication Ticket when User Impersonation is active, using the current ticket as a basis for the new ticket.
/// </summary>
private static void NewTicket(MyUser currentUser, 
                              string userData, 
                              bool createPersistentCookie)
{
    System.Web.Configuration.AuthenticationSection authSection =
        (System.Web.Configuration.AuthenticationSection)
        ConfigurationManager.GetSection("system.web/authentication");

    System.Web.Configuration.FormsAuthenticationConfiguration 
        formsAuthenticationSection = authSection.Forms;

    DateTime now = DateTime.Now;

    // see http://msdn.microsoft.com/en-us/library/kybcs83h.aspx
    // Create a new ticket used for authentication
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        2,                                          // Ticket version
        currentUser.UserName,                       // Username to be associated with this ticket
        now,                                        // Date/time issued
        now.Add(formsAuthenticationSection.Timeout),// Date/time to expire
        createPersistentCookie,
        userData,
        FormsAuthentication.FormsCookiePath);

    // Hash the cookie for transport over the wire
    string hash = FormsAuthentication.Encrypt(ticket);
    HttpCookie cookie = new HttpCookie(
        FormsAuthentication.FormsCookieName,    // Name of auth cookie (specified in web.config)
        hash);                                  // Hashed ticket

    // Add the cookie to the list for outbound response
    HttpContext.Current.Response.Cookies.Add(cookie);
}

您可以使用相同的技术在用户已登录时重新创建故障单。例如,您需要更改Ticket.UserData。发行新票证时,您将增加版本号。

答案 1 :(得分:2)

我认为您的超时是由会话超时而非身份验证超时

引起的

检查 web.config中的会话状态节点。

<sessionState mode="InProc"
                    cookieless="true"
                    timeout="60"/>

答案 2 :(得分:0)

您不能同时拥有表单身份验证票证的滑动和绝对过期时间。

请参阅我对this SO question的回答,以获取概述以及指向理解ASP.NET中的表单身份验证的教程的链接。

更新

  

如何为用户设置超时   说完后他们不做任何要求   会议被杀了10分钟   他们已经退出

已注销=表单身份验证并与会话(状态)正交(例如,存储数据的位置)。

简单的答案是不在会话中存储数据。请参阅this SO question,它与您想要的类似。