我必须为客户建立一个快速的会员系统,他们有一些要求不允许我立即使用内置,也没有时间构建他们想要的东西。我计划最终推出一个完整的会员管理系统,但和你一样,我现在需要一些东西。我采用了以下计划,最终,我可以将内置提供程序换成我自己的 - 时间限制和截止日期很糟糕:
我有自己的个人用户表 (PT) - MembershipId、用户名、电子邮件、多余的个人资料信息。这是应用程序用于任何用户信息的内容。它是一个类,它可以被缓存,保存在 http 上下文中,cookie - 但是你想处理你的用户信息。
然后,我为身份验证、授权和角色设置了 SqlProfileProvider。我不使用配置文件提供程序(即使是琐碎的设置),因为它在 MVC 中很痛苦。我没有对内置提供程序进行任何更改。这就是我用于身份验证和授权的内容。
创建用户时,我的代码执行以下操作:
- 根据我的规则检查 PT 的用户名和电子邮件
- 创建 Guid - MembershipId
- 创建MembershipUser,MembershipId为用户名(邮箱无关,不使用),以及用户密码、问答等。
- 在 PT 中使用配置文件值创建用户,并使用 MembershipId 作为 PrimaryKey。
登录时,我从 PT 获取 MembershipId,使用 MembershipId 和密码验证 Membership,我就完成了。
删除用户时,我执行以下操作:
- 检查用户的 PT,确保我可以/应该删除
- 获取 MemberShipId
- 使用交易
- 从 PT 中删除
- User Membership.DeleteUser(MembershipId, true) - 这确保用户从成员资格和其他 aspnet_ 表中删除
- 犯罪
它按预期工作:)
一些事情:
User.Identity.Name 将是 MembershipId (Guid)。这用于登录和角色管理。我的 PT 是保存用户信息(保存密码)的地方。我可以更改用户名、电子邮件等,而不会影响成员资格或角色,因为成员资格是基于 PT 的 PrimaryKey。
登录需要额外的数据库命中,因为您需要查询 PT 以获取 MembershipId 进行验证(您可以缓存)。
内置的身份验证系统非常繁重 - 如果您查看存储过程,您会看到它为验证用户所经历的所有环节。我建议最终远离它。但在紧要关头,它做得很好——如果你没有百万用户,我认为这不是问题。
我没有考虑过 OpenId,我不确定您将如何集成它,尽管我认为您可能可以做与上述相同的事情,而不是验证实际凭据(在它们返回经过验证的 OpenId 表单之后)只需登录使用 MembershipId 的用户(不要验证 Membership)。
对我来说,这背后的要点是该应用程序使用自定义用户模型,允许更改用户名、电子邮件、姓名等。而不影响身份验证和角色。当我准备好更改为完整的系统时,我可以更改它而不用担心对应用程序的影响。