首页 文章

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

提问于
浏览
3

我已经使用自定义数据存储实现了我自己的自定义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

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

  • 1

    这篇文章(以及其他内容)显示了存储在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

    FormsAuthenticationTicket cookie有一个UserData属性,你可以存储你想要的任何东西 . 我在那里抛出JSON序列化对象图,用于缓存用户相关的东西,如Last,First names或其他角色信息 .

    有一些尺寸限制,但只要你明智,你应该没问题 .

  • 2

    只需自己单独存放即可 . auth所做的所有表单都将它存储在cookie中并在服务器上加密/解密 . 您可以自己加密/解密数据 . 您还可以使用其他存储,如磁盘I / O或缓存,因此您不会在客户端上存储任何内容 .

    HTH .

  • 0

    如何使用Session呢?

  • 4

    我会使用Profile来存储自定义用户信息,它毕竟是为它设计的:)

    ASP.Net Profile

    如果您需要以更多SQL结构化格式存储信息,请使用Custom Profile Provider

    在您的自定义配置文件中,您可以实现缓存,我相信您可以将其扩展到大量用户 .

  • 0

    配置文件是存储自定义用户特定数据的最佳方式 . 您所要做的就是在web.config页面中创建字段,然后像会话状态变量一样引用它们 . 会话状态适用于在1个会话期间持久存在的数据(因此名称) .

    Web.Config中:

    <profile>
            <properties>
                <add name="DepartmentNumber"/>
            </properties>
        </profile>
    

    保存到 Profiles :

    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.
    

相关问题