在MembershipProvider / FormsAuthenticationTicket中存储其他用户数据

时间:2010-08-02 15:48:48

标签: c# asp.net asp.net-mvc asp.net-mvc-2

我已经使用自定义数据存储实现了我自己的自定义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中存储其他用户数据的最佳做法是什么?

7 个答案:

答案 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存储自定义用户信息,它毕竟是为它设计的:)

ASP.Net 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)

如果您每次需要此数据时都关注往返查询,请执行会话状态和配置文件的组合。将数据存储在配置文件中,然后在登录成功后,将这些值捕获到会话状态。在该会话期间使用会话状态中的它们。您甚至可以添加一个检查,如果会话状态为空,它将查询配置文件。