超时无法在ASP.Net MVC FormsAuthentication中工作

时间:2012-01-24 15:49:39

标签: asp.net-mvc-3

我正在使用FormsAuthentication,我在设置TimeOut值时遇到问题。

我已经看过其他一些与此相关的帖子,但它们似乎不是我的问题,或者建议的解决方案无效。

我的web.config包含以下内容:

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn"
         timeout="1"
         cookieless="UseCookies" />
</authentication>

我已将AuthorizeAttribute放在我想要保护的控制器上。

我可以查看.ASPXAUTH cookie(使用FireCookies),我可以看到它设置为在登录后1分钟到期。

如果我通过我的代码调试,我可以看到FormsAuthentication.Timeout = 1。

但是我的门票在1分钟内似乎没有超时。在1分钟不活动后,我仍然可以使用AuthorizeAttribute浏览到控制器。

实际上我实际上可以使用FireCookies删除.ASPXAUTH cookie,我仍然可以使用AuthorizeAttribute浏览到控制器。

长时间不活动后很奇怪(抱歉没有确切的时间 - 我外出吃午饭!)TimeOut发生了,我被重定向 登录屏幕。

有什么想法吗?

3 个答案:

答案 0 :(得分:10)

我也有同样的问题。实际上,它是因为我无法从javascript中读取表单身份验证cookie,过了一段时间undefined。我只是想知道我是否通过javascript进行了身份验证。

后来我发现机票已经过期,但我没有退出(也是。所以我也想解决这个问题)!我看到你的问题没有得到解答,所以我把问题保持开放了半天。以下是我提出的似乎正在起作用的内容。

我的答案基于这个答案。用户 ScottS

https://stackoverflow.com/a/454639/511438

这是我的ASP.NET MVC 3项目。

这是我的登录代码。未显示,之前的自定义用户身份验证逻辑。这只是设置初始票。

公共类FormsAuthenticationService:IFormsAuthentication

public void SignIn(string userName, bool createPersistentCookie, string role)
{
    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
            1,                             // version
            userName,           // user name
            DateTime.Now,                  // created
            DateTime.Now.Add(FormsAuthentication.Timeout),   // expires
            false,                    // rememberMe?
            role                        // can be used to store roles
            );

    string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    HttpContext.Current.Response.Cookies.Add(authCookie);
}

在同一个类中,但是从global.asax

访问的静态方法
//-- this is based on https://stackoverflow.com/questions/454616/asp-net-cookies-authentication-and-session-timeouts
internal static FormsAuthenticationTicket RefreshLoginCookie(bool retainCurrentExpiry)
{
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie == null || authCookie.Value == null)
        return null;

    FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);

    DateTime expiryDate = (retainCurrentExpiry ? oldTicket.Expiration : DateTime.Now.Add(FormsAuthentication.Timeout));
    HttpContext.Current.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);

    var newTicket = new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, expiryDate,
        oldTicket.IsPersistent, oldTicket.UserData, oldTicket.CookiePath);

    HttpCookie newAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newTicket));
    HttpContext.Current.Response.Cookies.Add(newAuthCookie);

    return newTicket;

}

<强> Global.asax中

我的自定义是ajax请求不刷新表单身份验证票证。因此,如果您坐在那里超时,ajax请求会将您注销。如果你想让ajax请求保持票证活着(更改我的javascript cookie问题,而不是你的注销不活动问题),请更改。 *(提示,如果您注销,然后登录,但再次返回登录页面,第一次登录可能没有在查询字符串中指定returnUrl)。 *

protected virtual void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie == null || authCookie.Value == "")
    {
        return;
    }

    bool isAjax = new HttpRequestWrapper(System.Web.HttpContext.Current.Request).IsAjaxRequest();

    FormsAuthenticationTicket authTicket;
    try
    {
        //-- THIS IS WHAT YOU WANT
        authTicket = FormsAuthenticationService.RefreshLoginCookie(isAjax);
    }
    catch
    {
        return;
    }

    string[] roles = authTicket.UserData.Split(';');
    if (Context.User != null) Context.User = new GenericPrincipal(Context.User.Identity, roles);

}

<强>的Web.config 这是我设置会话超时和票证超时的部分

<configuration>
    <system.web>
        <sessionState mode="InProc" timeout="60" />
        <authentication mode="Forms">
            <forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" />
        </authentication>

答案 1 :(得分:0)

这是关于会话超时的时间。默认值为20分钟,您可以在web.config中更改它,如下所示:

<sessionState mode="InProc" timeout="20"/>

答案 2 :(得分:0)

一个显而易见的解决方案可以让一些人轻松查看,清除浏览器cookie或注销可以解决问题。如果选中“记住我”,则无论对Web.Config超时值所做的更改,应用程序都将继续使用旧cookie登录。