Подтвердить что ты не робот

Тайм-аут не работает в ASP.Net MVC FormsAuthentication

Я использую FormsAuthentication, у меня возникают проблемы с установкой значения TimeOut.

Я видел некоторые другие сообщения, связанные с этим, но они, похоже, не являются моей проблемой, или предлагаемое решение не помогает.

У моего web.config есть следующее:

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

Я поставил AuthorizeAttribute на контроллерах, которые я хочу защитить.

Я могу просмотреть файл cookie.ASPXAUTH(используя FireCookies), и я вижу, что он истекает через 1 минуту после входа в систему.

Если я отлаживаю свой код, я вижу, что FormsAuthentication.Timeout = 1.

Однако мой билет не кажется тайм-аутом через 1 минуту. После 1 минуты бездействия я все еще могу перейти к контроллерам с помощью AuthorizeAttribute.

Фактически я могу фактически удалить cookie.ASPXAUTH с помощью FireCookies, и я все еще могу перейти к контроллерам с атрибутом AuthorizeAttribute.

Необычно после долгого неактивного (извините, у меня нет точного времени - я был на обед!), TimeOut происходит, и я перенаправлен на экран входа в систему.

Любые идеи?

4b9b3361

Ответ 1

У меня тоже была такая же проблема. На самом деле, это произошло потому, что я не мог прочитать cookie проверки подлинности форм из javascript, это было через некоторое время undefined. Я просто хотел узнать, была ли я аутентифицирована через javascript.

Позже я обнаружил, что билет истек, но я не выходил из системы (также, поэтому я тоже хотел это решить)! Я видел, что на ваш вопрос не был дан ответ, поэтому я оставил его открытым, пока я работал над своими проблемами полдня. Следующее - это то, с чем я столкнулся, что, похоже, работает.

Мой ответ основан на этом ответе. fooobar.com/questions/166721/... пользователем СкоттС

Это в моем проекте 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, а не к проблеме бездействия выхода из системы). * (подсказка, если вы выйдете из системы, а затем войдите в систему, но снова вернитесь на страницу входа в систему, первый логин, возможно, не указал returnUrl в querystring). *

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>

Ответ 2

Это время ожидания вашего сеанса. По умолчанию 20 минут, и вы можете изменить его в файле web.config следующим образом:

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

Ответ 3

Очевидное решение, которое может быть легко просмотрено некоторыми людьми, очистка куки файлов браузера или выход из системы, должно решить проблему. Если помнить, что я отмечен, приложение будет вести вход в старый файл cookie независимо от изменений, внесенных в значение тайм-аута Web.Config.