System.Web.Security.FormsAuthentication.Encrypt返回null

时间:2010-04-21 20:31:20

标签: asp.net forms-authentication

我正在尝试使用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始终为nulluser_item字符串的长度是否有限制?

由于 穆斯塔法

3 个答案:

答案 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

MSDN

也有一些记录
  

请注意

     

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

....