2010-04-21 26 views
13

Estoy intentando cifrar algunos userData para crear mis propios objetos IPrincipal y IIdentity personalizados mediante la autenticación de formularios: he serializado un objeto que representa a mi usuario conectado a Json y he creado mi boleto FormsAuthentication así:System.Web.Security.FormsAuthentication.Encrypt devuelve nulo

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); 

Sin embargo, la cadena encrypted_ticket es siempre null. ¿Hay un límite en la longitud de la cadena user_item?

Gracias Mustafa

+0

¿Algún progreso con esto? –

+4

Para mí, si la propiedad Name en el ticket es nula, la función Encrypt devuelve null. El límite de 4 KB se aplica a la cookie y no al valor encriptado. Si el valor cifrado es superior a 4 KB, el intento de agregar una cookie fallará. – Mayo

+0

mismo problema conmigo, pero con el mío @Mayo la respuesta se solucionó –

Respuesta

8

Sí, el límite típico cookie es ~ 4k.

Agregue el cifrado y usted está abajo de < 2k.

Su código es correcto .. tener en cuenta:

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); 

Rendimiento:

 
95ED981CFDF6AE506650E2AD01D2B52666AFC4895F0E19F14D82628C3F263EF1DA77F73BFD0284BEDCF815FBFB9AF00AF8875C61D01E27BF53C229F19C7CDE54FBC10AC478FAF02237DDC545AEF32BBA8EED88DBB09D671CD87E685E9FE05908CAE02EB05880DC1D230D67AEB0D7B0F258435D906EBD7F505DCCD738D94532E96363B13DA92060720476619672FEC670 

Si bien es mi experiencia que las galletas hinchadas se truncan en comparación con anulado, su problema es, probablemente, que contiene JSON personajes que harán que tu cookie se deforme, rompiéndola.

Asegúrese de que su JSON es de un tamaño razonable, a continuación, tratar

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

asegúrese de medir las cookies y no tratar de empujarlo, se va a morder de manera sutil y viciosas cuando se quiere ser viendo a casa Perdido y bebiendo tequila. no es divertido.

+0

te perdiste porque eras bebiendo tequila? – JJS

26

Como una adición a este problema, cuando el parámetro userData es null la encrypted_ticket también será null.

En este ejemplo:

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 rendimientos ahora null. Sin embargo, cuando se utiliza una cadena vacía o string.Empty para el parámetro 0 userData, obtenemos un cifpted_ticket válido.

Esto también es algo documentado en MSDN

Nota

El parámetro userData no puede ser nulo.

+2

Gracias por los detalles - desear que se haya lanzado una excepción cuando userdata era nulo – Mustafakidd

+0

Gracias, amigo !!!!! – TheGateKeeper

+0

OMG Gracias. He pasado 2 horas tratando de resolver esto y llegar a nada. – coryrwest

1

He utilizado este código para redirigir a la página de inicio de sesión a la página pueden deafault.aspx y mi UserData era nula como su problema:

FormsAuthentication.RedirectFromLoginPage (nombre de usuario, false);

cambiar el código, pruebe este código para redirigir desde Login.aspx a Predeterminado.La página aspx y sus datos de usuario estarán bien:

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

.... 
Cuestiones relacionadas