Недопустимое значение для параметра encryptedTicket

Недавно я изменил логин для моего сайта eComm, чтобы включить функцию "Запомнить меня". Первичное изменение состояло в том, чтобы сделать cookie аутентификации форм постоянным для этих пользователей.

После того, как изменение было выпущено, я начал видеть это исключение в моих журналах:

Invalid value for 'encryptedTicket' parameter
at System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket)

Проблема, по-видимому, специфична для пользовательского агента. Единственными пользовательскими агентами, за которые была записана ошибка, являются:

  • Mozilla/5.0 (iPad, U, CPU OS 4_3_3, как Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, например, Gecko) Версия /5.0.2 Mobile/8J2 Safari/6533.18.5

  • Идентификатор тега eTailInsights/1.0

У меня есть iPad с приведенной выше конфигурацией. Первая попытка входа в систему работает. Но закрытие браузера и возвращение на сайт, поэтому использование постоянного файла cookie вызывает ошибку.

Поведение также несовместимо в разных средах. Он отлично работает на моем локальном компьютере и тестовом сервере, но не работает. Это затрудняет устранение неполадок.

Другие версии iOS/Safari могут войти в систему.

В поисках этой ошибки появилось несколько ссылок на проблему с веб-формами и более новыми версиями браузера. Однако это не похоже на мой сценарий. Я не вижу ошибок для новых браузеров, а мой сайт - MVC.

Я нашел один question, похожий на мой, но без ответа.

Кто-нибудь знает, что здесь происходит?

Ответ 1

Я столкнулся с такой же проблемой, потому что я получал null или пустое значение authCookieValue. Поэтому мое предложение состоит в том, что вы должны проверить значение null для HttpCookie, а также на значение, указанное ниже.

HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            //Extract the forms authentication cookie
            if (!string.IsNullOrEmpty(authCookie.Value))
            {
                FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

                string email = authTicket.UserData;

                // and now process your code as per your condition

            }
        }

Это определенно поможет вам.

Ответ 2

Это происходит, если вы передаете недопустимую строку в System.Web.Security.FormsAuthentication.Decrypt. Чаще всего он пытается передать cookieName вместо cookieValue.

Ниже приведен способ получения значения cookie ASPXAUTH + info:

string authCookieValue = HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName].Value;
var cookieInfo = System.Web.Security.FormsAuthentication.Decrypt(authCookieValue);

Ответ 3

Что я узнал, так это то, что по какой-то причине cookie может получить непоследовательную ценность. Для нас это были только некоторые пользователи, в некоторых ситуациях.

Лучше, чем повышение ошибки, я просто предлагаю зарегистрировать пользователя в случае возникновения аргумента. Он не объясняет "почему", не полностью удовлетворяет (в некотором смысле "запомнить меня" не будет работать для некоторых пользователей...), но, по крайней мере, он может поддерживать нормальное поведение для пользователя.

В global.asax:

 protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

        if (authCookie != null)
        {
            try
            {
                var authTicket = FormsAuthentication.Decrypt(authCookie.Value);

                //...
                //setting user properties with cookie...
                //...
            }
            catch (ArgumentException ex)
            {
                FormsAuthentication.SignOut();
                Response.Redirect("/");
            }
        }
    }

Не уверен, что перенаправление требуется (нужно было бы проверить).

Надеюсь, что это поможет

Ответ 4

У вас может быть такая же ошибка, когда длина билета, который вы пытаетесь десериализовать, слишком длинная.