我正在尝试使用Forms身份验证来加密某些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
字符串的长度是否有限制?
由于 穆斯塔法
答案 0 :(得分:31)
作为此问题的补充,当 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 。
请注意
userData参数不能为空。
答案 1 :(得分:8)
是的,典型的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
虽然根据我的经验,臃肿的cookie被截断而不是被取消,但您的问题可能是JSON包含会使您的cookie格式错误的字符,从而破坏它。
确保您的json尺寸合理,然后尝试
string user_item = Server.UrlEncode(GetJsonOfLoggedinUser());
确保你测量你的饼干,不要试图推动它,当你想回家看迷失和喝龙舌兰酒时,它会以微妙和恶毒的方式咬人。没有乐趣。
答案 2 :(得分:1)
我使用此代码从登录页面重定向到deafault.aspx页面,我的UserData像你的问题一样空白:
FormsAuthentication.RedirectFromLoginPage(username,false);
我更改了代码,尝试使用此代码从Login.aspx重定向到Default.aspx页面,您的用户数据就可以了:
Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, false));
....