ASP.MVC Запомнить меня, файл cookie не работает после истечения времени сеанса

В форме входа у меня есть возможность разрешить пользователю щелкнуть флажок «Запомнить меня», который создает новый FormsAuthenticationTicket, который затем добавляется в файл cookie.

if (_model.RememberMe)
{

    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                                      _model.Username,
                                      DateTime.Now,
                                      DateTime.Now.AddDays(30),
                                      true,
                                      _model.Username,
                                      FormsAuthentication.FormsCookiePath);

    // Encrypt the ticket.
    string encTicket = FormsAuthentication.Encrypt(ticket);

    // Create the cookie.
    Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

Который, как мы надеемся, должен быть в браузере клиентов в течение 30 дней, как указано выше.

Тестируя это, я намеренно оставил текущий тайм-аут сеанса всего на минуту.

<sessionState timeout="1"></sessionState>

Итак, через минуту, если пользователь сказал «запомнить меня», я ожидаю, что веб-сайт не должен быть перенаправлен обратно на страницу входа. Однако это так. Это код, который делает это.

        // [".ASPXAUTH"] is the cookie name that is created by the FormsAuthenticationTicket`
        if (User.Identity.Name == "" && Request.Cookies[".ASPXAUTH"] == null)
        {

            return RedirectToAction("LogOut", "Login");
        }


        // the current session hasn't timed out or the remember me cookie is enabled
        FormsIdentity id = (FormsIdentity)User.Identity;
        FormsAuthenticationTicket ticket = id.Ticket;

Но файл cookie равен NULL.

Я ожидаю, что это недоразумение с моей стороны, поэтому, если кто-нибудь может мне помочь. Я был бы очень признателен.

Спасибо


person user3428422    schedule 23.12.2014    source источник
comment
Почему вы делаете это вручную, а не используете FormsAuthentication.SignIn?   -  person Vsevolod Goloviznin    schedule 23.12.2014
comment
Потому что я никогда не слышал об этом до сих пор, лол   -  person user3428422    schedule 23.12.2014
comment
А с .NET 4.5 нет FormsAuthentication.SignIn возможно он устарел   -  person user3428422    schedule 23.12.2014
comment
Тогда почему бы вам не прочитать несколько руководств о том, как реализовать это правильно? На asp.net/mvc есть несколько неплохих   -  person Vsevolod Goloviznin    schedule 23.12.2014


Ответы (1)


То, что вы ищете, это

string mySessionCookie = System.Web.HttpContext.Current.Request.Headers["Cookie"];
if (mySessionCookie.IndexOf(".ASPXAUTH", StringComparison.Ordinal) >= 0) {
    // do something
}

ИЗМЕНИТЬ

Как насчет этого, я не проверял это, но я помню, что делал что-то подобное раньше

HttpCookie cookie = (HttpCookie)(Request.Cookies[FormsAuthentication.FormsCookieName]);
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
person Mō Iđɍɨɇƶ    schedule 23.12.2014
comment
Спасибо, это работает, однако я не могу получить доступ к имени пользователя из файла cookie таким образом. - person user3428422; 23.12.2014
comment
Я предложил другой подход, однако я должен сказать, что Request.Cookies[.ASPXAUTH] работает для меня. - person Mō Iđɍɨɇƶ; 23.12.2014
comment
@user3428422 user3428422, если это ответило на ваш вопрос, не могли бы вы пометить его как отвеченный. Спасибо. - person Mō Iđɍɨɇƶ; 05.11.2015
comment
Не могу вспомнить - я так не думаю, так как обычно сразу отмечаю, я пересмотрю сегодня - person user3428422; 06.11.2015