我已经使用自定义数据存储实现了我自己的自定义MembershipProvider。到目前为止没问题。我希望人们使用他们的电子邮件而不是用户名登录。因为我有自己的数据存储,这不是主要问题,我可以将电子邮件作为MembershipProvider的用户名传递。
我的问题是,如何在FormsAuthenticationTicket中存储其他自定义用户数据?我想存储一些永远不会改变的东西,例如UserId,First / Last Name和Country。我开始考虑使用UserData创建FormsAuthenticationTicket,但很快就感到困惑。如何将多个内容存储到此UserData中,以及如何轻松在每个ASP.NET MVC2页面上读取此数据。我找到了许多样本,没有一个在MVC2方面看起来真的很棒。必须有一个简单的方法来做到这一点。
从每个请求的数据库中读取UserId,First / Last Name和Country是没有意义的,因为它永远不会改变。另外,虽然我希望用户使用他们的电子邮件登录,但我想将他们的UserId存储在auth cookie中,这样它几乎可以用于每个用户相关的数据库查询而不是电子邮件(因为在所有表中,用户数据与UserId一起存储 - 而不是电子邮件,因为从技术上讲,电子邮件可能会被更改 - 我已经知道,当涉及到MembershipProvider时,这些东西已经消失了。
在ASP.NET MVC2中存储其他用户数据的最佳做法是什么?
答案 0 :(得分:4)
此帖显示(除其他外)存储在FormsAuthenticationTicket.UserData中并从基本控制器读取它的详细信息。 http://www.west-wind.com/weblog/posts/899303.aspx
正如上面提到的那样,一个包含所有必需信息的简单数据类和一对序列化/反序列化方法将完成这项工作。
public class UserState
{
public int Id { get; set; }
public Guid ActivationId { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public bool IsAdmin { get; set; }
// Serialize
public override string ToString()
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
string result = serializer.Serialize(this);
return result;
}
// Deserialize
public static UserState FromString(string text)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Deserialize<UserState>(text);
}
}
}
答案 1 :(得分:2)
FormsAuthenticationTicket cookie有一个UserData属性,你可以存储任何你想要的东西。我在那里抛出JSON序列化对象图,用于缓存用户相关的东西,如Last,First names或其他角色信息。
有一些尺寸限制,但只要你明智,你应该没问题。
答案 2 :(得分:1)
自己单独存放。 auth所做的所有表单都将它存储在cookie中并在服务器上加密/解密。您可以自己加密/解密数据。您还可以使用其他存储,如磁盘I / O或缓存,因此您不会在客户端上存储任何内容。
HTH。
答案 3 :(得分:1)
如何使用Session?
答案 4 :(得分:0)
我会使用Profile存储自定义用户信息,它毕竟是为它设计的:)
如果您需要以更多SQL结构化格式存储信息,请使用Custom Profile Provider
在您的自定义配置文件中,您可以实现缓存,我相信您可以将其扩展到大量用户。
答案 5 :(得分:0)
配置文件是存储自定义用户特定数据的最佳方式。您所要做的就是在web.config页面中创建字段,然后像会话状态变量一样引用它们。会话状态适用于在1个会话期间持久存在的数据(因此名称)。
Web.Config中:
<profile>
<properties>
<add name="DepartmentNumber"/>
</properties>
</profile>
保存到个人资料:
ProfileCommon newProf = Profile.GetProfile(username);
newProf.DepartmentNumber = "12"; //Or whatever string data you have.
newProf.Save();
参考:
String departmentNumber = Profile.DepartmentNumber; //Data is stored as String.
答案 6 :(得分:0)
如果您每次需要此数据时都关注往返查询,请执行会话状态和配置文件的组合。将数据存储在配置文件中,然后在登录成功后,将这些值捕获到会话状态。在该会话期间使用会话状态中的它们。您甚至可以添加一个检查,如果会话状态为空,它将查询配置文件。