我已经使用自定义数据存储实现了我自己的自定义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 回答
如果您在每次需要此数据时都关注往返查询,那么请执行会话状态和配置文件的组合 . 将数据存储在配置文件中,然后在登录成功后,将这些值捕获到会话状态 . 在该会话期间使用会话状态中的它们 . 您甚至可以添加一个检查,如果会话状态为空,它将查询配置文件 .
这篇文章(以及其他内容)显示了存储在FormsAuthenticationTicket.UserData中并从基本控制器读取它的详细信息 . http://www.west-wind.com/weblog/posts/899303.aspx
正如上面提到的那样,一个包含所有需要信息的简单数据类和一对序列化/反序列化方法将完成这项工作 .
FormsAuthenticationTicket cookie有一个UserData属性,你可以存储你想要的任何东西 . 我在那里抛出JSON序列化对象图,用于缓存用户相关的东西,如Last,First names或其他角色信息 .
有一些尺寸限制,但只要你明智,你应该没问题 .
只需自己单独存放即可 . auth所做的所有表单都将它存储在cookie中并在服务器上加密/解密 . 您可以自己加密/解密数据 . 您还可以使用其他存储,如磁盘I / O或缓存,因此您不会在客户端上存储任何内容 .
HTH .
如何使用Session呢?
我会使用Profile来存储自定义用户信息,它毕竟是为它设计的:)
ASP.Net Profile
如果您需要以更多SQL结构化格式存储信息,请使用Custom Profile Provider
在您的自定义配置文件中,您可以实现缓存,我相信您可以将其扩展到大量用户 .
配置文件是存储自定义用户特定数据的最佳方式 . 您所要做的就是在web.config页面中创建字段,然后像会话状态变量一样引用它们 . 会话状态适用于在1个会话期间持久存在的数据(因此名称) .
Web.Config中:
保存到 Profiles :
参考: