2010-04-21 13 views
13

Ich versuche, einige userData zu verschlüsseln, um meine eigenen benutzerdefinierten IPrincipal und IIdentity Objekte mit Forms-Authentifizierung zu erstellen - Ich habe ein Objekt serialisiert, das meinen angemeldeten Benutzer zu Json und erstellt Ticket mein FormsAuthentication wie so:System.Web.Security.FormsAuthentication.Encrypt gibt null zurück

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

jedoch die Zeichenfolge encrypted_ticket ist immer null. Gibt es eine Grenze für die Länge der user_item Zeichenfolge?

Dank Mustafa

+0

irgendwelche Fortschritte damit? –

+4

Wenn die Eigenschaft Name des Tickets null ist, gibt die Funktion Encrypt null zurück. Das 4-KB-Limit gilt für den Cookie und nicht für den verschlüsselten Wert. Wenn der verschlüsselte Wert größer als 4 KB ist, schlägt der Versuch fehl, einen Cookie hinzuzufügen. – Mayo

+0

dasselbe Problem mit mir, aber mit mir @Mayo Antwort behoben –

Antwort

8

Ja, die typische Cookie Grenze ~ 4k.

Fügen Sie Verschlüsselung hinzu und Sie sind auf < 2k.

Ihr Code korrekt ist .. betrachten:

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

Ausbeuten:

 
95ED981CFDF6AE506650E2AD01D2B52666AFC4895F0E19F14D82628C3F263EF1DA77F73BFD0284BEDCF815FBFB9AF00AF8875C61D01E27BF53C229F19C7CDE54FBC10AC478FAF02237DDC545AEF32BBA8EED88DBB09D671CD87E685E9FE05908CAE02EB05880DC1D230D67AEB0D7B0F258435D906EBD7F505DCCD738D94532E96363B13DA92060720476619672FEC670 

Während es ist meine Erfahrung, dass aufgeblähte Cookies abgeschnitten als zu nulled Gegensatz ist Ihr Problem wahrscheinlich, dass JSON enthält Zeichen, die dazu führen, dass Ihr Cookie missgebildet wird und es dadurch beschädigt wird.

Stellen Sie sicher, json ist eine vernünftige Größe, versuchen dann

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

Stellen Sie sicher, Ihre Cookies zu messen und versuchen Sie nicht, es zu schieben, es in subtiler und bösartig Wege beißen, wenn Sie sein möchten Zuhause beobachten Lost and trinkender Tequila. kein Spaß.

+0

haben Sie verloren, weil Sie waren trinkender Tequila? – JJS

26

Als Ergänzung zu diesem Thema, wenn die Userdata Parameter sind null die encrypted_ticket auch null sein.

In diesem Beispiel:

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 Ausbeuten jetzt null. Wenn Sie jedoch eine leere Zeichenfolge oder string.Empty für den Parameter userData verwenden, erhalten wir eine gültige chiffreed_ticket.

auch auf MSDN

Userdata-Parameter kann nicht null sein

Hinweis: Dies ist ein wenig dokumentiert.

+2

Danke für die Details - wünschen eine Ausnahme wurde ausgelöst, wenn userdata null war. – Mustafakidd

+0

Danke Mann !!!!! – TheGateKeeper

+0

OMG Danke. Ich habe 2 Stunden versucht, herauszufinden, und nirgendwo. – coryrwest

1

i verwendet diesen Code von Login-Seite umleiten können Seite deafault.aspx und meine Userdata war Null wie Ihr Problem:

FormsAuthentication.RedirectFromLoginPage (Benutzername, false);

ich den Code ändern, versuchen Sie diesen Code, um von Login.aspx auf Standard umzuleiten.aspx Seite und Ihre Benutzerdaten werden in Ordnung sein:

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

....