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

bpl*_*lus 17 asp.net-mvc-3

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

我已经看到了一些与此相关的其他帖子,但它们似乎不是我的问题,或者建议的解决方案没有帮助.

我的web.config有以下内容:

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn"
         timeout="1"
         cookieless="UseCookies" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

有任何想法吗?

Val*_*mas 10

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

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

我的答案基于这个答案.用户ScottS的/sf/answers/31824761/

这是在我的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);
}
Run Code Online (Sandbox Code Playgroud)

在同一个类中,但是从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;

}
Run Code Online (Sandbox Code Playgroud)

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);

}
Run Code Online (Sandbox Code Playgroud)

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

<configuration>
    <system.web>
        <sessionState mode="InProc" timeout="60" />
        <authentication mode="Forms">
            <forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" />
        </authentication>
Run Code Online (Sandbox Code Playgroud)


bob*_*bek 0

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

<sessionState mode="InProc" timeout="20"/>
Run Code Online (Sandbox Code Playgroud)

  • 但会话状态与 AuthenticationTicket/.ASPXAUTH cookie 是分开的。至少我认为是这样?! (2认同)