Другой результат при чтении FormsAuthenticationTicket

У меня есть два блока кодов, которые должны выполнять ту же работу, то есть копировать весь FormsAuthenticationTicket и изменяя один бит, который хранится в UserData,

Первый код правильно читает все, включая UserData, Второе не включает UserData, Он просто возвращает пустую строку. Я понял, что когда было сгенерировано исключение, потому что если пустой объект.

Любая идея?

Первый код:

string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = HttpContext.Request.Cookies[cookieName];
if (authCookie != null)
{
    FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);
    UserData userDataObj = JsonConvert.DeserializeObject<UserData>(oldTicket.UserData);
    userDataObj.PassChangeRequired = user.PasswordChangeRequired;
    string userdata = JsonConvert.SerializeObject(userDataObj);
    FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
                                                oldTicket.Version,
                                                oldTicket.Name,
                                                oldTicket.IssueDate,
                                                oldTicket.Expiration,
                                                oldTicket.IsPersistent,
                                                userdata,
                                                oldTicket.CookiePath);
    authCookie.Value = FormsAuthentication.Encrypt(newTicket);
    Response.Cookies.Set(authCookie);
}

Второй код:

HttpCookie authCookie = FormsAuthentication.GetAuthCookie(user.UserName, false);
if (authCookie != null)
{
    FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);
    UserData userDataObj = JsonConvert.DeserializeObject<UserData>(oldTicket.UserData);
    userDataObj.PassChangeRequired = user.PasswordChangeRequired;
    string userdata = JsonConvert.SerializeObject(userDataObj);
    FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
                                                oldTicket.Version,
                                                oldTicket.Name,
                                                oldTicket.IssueDate,
                                                oldTicket.Expiration,
                                                oldTicket.IsPersistent,
                                                userdata,
                                                oldTicket.CookiePath);
    authCookie.Value = FormsAuthentication.Encrypt(newTicket);
    Response.Cookies.Set(authCookie);
}

1 ответ

Решение

Если вы посмотрите на MSDN для метода GetAuthCookie(), который вы используете в примере 2, вы увидите, что он говорит:

Создает файл cookie аутентификации для данного имени пользователя.

Это означает, что когда вы делаете этот вызов в примере 2, вы на самом деле получаете новый только что созданный куки-файл аутентификации, а не тот, который вы уже установили. Вот почему UserData свойство пусто / пусто.