System.Web.Security.FormsAuthentication.Encrypt возвращает null

Я пытаюсь зашифровать некоторые userData для создания своих собственных объектов IPrincipal и IIdentity с использованием проверки подлинности с помощью форм. Я сериализую объект, представляющий зарегистрированного пользователя в Json, и создал свой билет FormsAuthentication следующим образом:

string user_item = GetJsonOfLoggedinUser();/*get JSON representation of my logged in user*/

System.Web.Security.FormsAuthenticationTicket ticket = 
    new System.Web.Security.FormsAuthenticationTicket(1,
    WAM.Utilities.SessionHelper.LoggedInEmployee.F_NAME + " " 
    + WAM.Utilities.SessionHelper.LoggedInEmployee.L_NAME,
    DateTime.Now, DateTime.Now.AddMinutes(30), false, user_item);

string encrypted_ticket = System.Web.Security.FormsAuthentication.Encrypt(ticket);

HttpCookie auth_cookie = 
    new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,        encrypted_ticket);

Response.Cookies.Add(auth_cookie);

Однако строка encrypted_ticket всегда null. Есть ли ограничение на длину строки user_item?

Спасибо Мустафа

Ответы

Ответ 1

Да, типичный предел файлов cookie ~ 4k.

Добавьте шифрование, и вы уменьшите до < 2k.

Ваш код правильный.. рассмотрите:

string user_item = "fsddfdfssdfsfdasdfsf";

System.Web.Security.FormsAuthenticationTicket ticket =
    new System.Web.Security.FormsAuthenticationTicket(1,
     " sdfasdf asdflasdfasd ",
    DateTime.Now, DateTime.Now.AddMinutes(30), false, user_item);

string encrypted_ticket = 
    System.Web.Security.FormsAuthentication.Encrypt(ticket);

HttpCookie auth_cookie = 
    new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName, encrypted_ticket);

Урожайность:

95ED981CFDF6AE506650E2AD01D2B52666AFC4895F0E19F14D82628C3F263EF1DA77F73BFD0284BEDCF815FBFB9AF00AF8875C61D01E27BF53C229F19C7CDE54FBC10AC478FAF02237DDC545AEF32BBA8EED88DBB09D671CD87E685E9FE05908CAE02EB05880DC1D230D67AEB0D7B0F258435D906EBD7F505DCCD738D94532E96363B13DA92060720476619672FEC670

Хотя мой опыт заключается в том, что раздутые куки файлы усекаются, а не нулевые, ваша проблема, вероятно, заключается в том, что JSON содержит символы, которые сделают ваш файл cookie искаженным, тем самым сломав его.

Убедитесь, что ваш json имеет разумный размер, а затем попробуйте

string user_item = Server.UrlEncode(GetJsonOfLoggedinUser());

Удостоверьтесь, что вы измеряете свои файлы cookie и не пытаетесь его подтолкнуть, он будет укусить тонким и порочным способом, когда вы захотите быть дома, смотря на потерянную и пьющую текилу. нет удовольствия.

Ответ 2

В качестве дополнения к этой проблеме, когда параметр userData null, encrypted_ticket также будет null.

В этом примере:

var ticket = new System.Web.Security.FormsAuthenticationTicket(1,
         "username",
        DateTime.Now, DateTime.Now.AddMinutes(30), false, null);

string encrypted_ticket = System.Web.Security.FormsAuthentication.Encrypt(ticket);

encrypted_ticket теперь дает null. Однако при использовании пустой строки или string.Empty для параметра userData мы получаем действительный encrypted_ticket.

Это также несколько документировано на MSDN

Примечание

Параметр userData не может быть нулевым.

Ответ 3

я использовал этот код для перенаправления с страницы входа на страницу deafault.aspx, а мои UserData были нулевыми, как ваша проблема:

FormsAuthentication.RedirectFromLoginPage(имя пользователя, ложь);

Я меняю код, попробуйте этот код перенаправить с Login.aspx на страницу Default.aspx, и ваши Пользовательские данные будут в порядке:

Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, false));

....