asp.net-mvc - 如何在 ASP.NET MVC 中实现基于 ID 的用户系统(成员资格、授权等)?

标签 asp.net-mvc openid membership membership-provider roleprovider

我一直在思考如何解决在使用 ASP.NET MVC 时实现基于 ID 的用户系统的问题。我的目标与 StackOverflow 的系统非常相似,如下所示:

  • 允许用户在没有“避免重复”限制的情况下更改他们的昵称。
  • 允许用户通过 OpenID 进行身份验证(暂时不使用密码)。

我想尽可能避免返工,所以我最初想到使用成员资格、角色和(可能)个人资料提供程序,但我发现它们是基于用户名的。 我想通过使用用户名字段存储 ID 并在基于密码的方法等上抛出 UnsupportedException 来调整 SqlMembershipProvider 的 hell ,以便能够使用其他系统。但这感觉笨拙且笨拙(如果可能的话)。

另一方面,也许我应该建立自己的用户系统,但我不确定即使我不能使用提供程序,我仍然可以使用 MVC 的一些功能(将我的代码插入 MVC 某处,我可以想到 AuthorizeAttribute 。

所以我想知道是否有人遇到过相同的设计问题,以及他们提出了哪些解决方案。

越详细越好!

最佳答案

我必须为客户建立一个快速的成员(member)系统,他们有一些要求不允许我立即使用内置功能,也没有时间构建他们想要的东西。我计划最终推出一个完整的成员(member)管理系统,但像你一样,我现在需要一些东西。我采用了以下计划,最终将允许我将内置提供程序换成我自己的 - 时间限制和截止日期很糟糕:

我有自己的个人用户表 (PT) - MembershipId、用户名、电子邮件、多余的个人资料信息。这是应用程序用于任何用户信息的内容。它是一个类,它可以被缓存,保存在 http 上下文中,cookie - 但是你想处理你的用户信息。

然后我设置 SqlProfileProvider 以进行身份​​验证、授权和角色。我不使用配置文件提供程序(即使是微不足道的设置),因为这在 MVC 中很麻烦。我没有对内置提供程序进行任何更改。这就是我用于身份验证和授权的内容。

创建用户时,我的代码执行以下操作:

  1. 根据我的规则检查 PT 的用户名和电子邮件
  2. 创建 Guid - MembershipId
  3. 创建MembershipUser,MembershipId为用户名(email无关,不用),以及用户密码,问题及答案等。
  4. 使用配置文件值在 PT 中创建用户,并将 MembershipId 用作主键。

登录时,我从 PT 获取 MembershipId,使用 MembershipId 和密码验证 Membership,然后我就完成了..

删除用户时,我执行以下操作:

  1. 检查用户的 PT,确保我可以/应该删除
  2. 获取成员(member)身份
  3. 使用交易
  4. 从PT中删除
  5. User Membership.DeleteUser(MembershipId, true) - 这确保用户从成员资格和其他 aspnet_ 表中删除
  6. promise

它按预期工作:)

一些事情: User.Identity.Name 将是 MembershipId (Guid)。这用于登录和角色管理。我的PT是保存用户信息(保存密码)的地方。我可以更改用户名、电子邮件等而不影响成员资格或角色,因为成员资格基于 PT 的主键。

登录需要额外的数据库命中,因为您需要查询 PT 以获取 MembershipId 以进行验证(您可以缓存)。

内置的身份验证系统非常繁重 - 如果您查看存储过程,您会看到它为验证用户而经历的所有环节。我建议最终远离它。但在紧要关头,它做得很好 - 如果您没有数百万用户,我认为这不会成为问题。

我没有考虑 OpenId,我不确定您将如何集成它,尽管我认为您可能会做与上面相同的事情,而不是根据实际凭据进行验证(在他们从 OpenId 返回验证后)使用 MembershipId 登录用户(不要验证成员身份)。

对我来说,这背后的要点是该应用程序使用自定义用户模型,允许更改用户名、电子邮件、名称等,而不会影响身份验证和角色。当我准备好更改整个系统时,我可以更改它而不用担心对应用程序的影响。

关于asp.net-mvc - 如何在 ASP.NET MVC 中实现基于 ID 的用户系统(成员资格、授权等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102004/

相关文章:

python - 如何测试Python列表中序列的成员资格?

php - 建立基于 Paypal 的成员(member)网站 - total noob - would appreciate help

javascript - 如何在 mvc 4 中创建弹出窗口?

c# - Html.BeginForm 内的 Ajax.BeginForm

asp.net-mvc - Entity Framework Core、NpgSql 和 Postgis 异常

authentication - 是否有关于 OpenId 提供商的相对流行度的可用统计数据?

oauth - LDAP Provider over OpenID (Google OAuth) 后端

asp.net-membership - 为什么 ValidateUser 不返回更多?

asp.net-mvc - Ninject 如何在 ASP.NET MVC 中创建 Controller ?

python - 使用联合登录时保存用户设置