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

时间:2010-11-04 22:28:04

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

我一直在思考如何解决在使用ASP.NET MVC时实现基于ID的用户系统的问题。我的目标,就像StackOverflow的系统一样,如下:

  • 允许用户更改其昵称,而不会出现“避免重复”限制。
  • 允许用户通过OpenID进行身份验证(暂时不使用密码)。

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

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

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

越详细越好!

4 个答案:

答案 0 :(得分:2)

贤治,

我建议您查看一些existing OpenID providers for ASP.NET。使它们适用于MVC应该相当容易。

埃里克

答案 1 :(得分:2)

我必须为客户设置一个快速会员系统,他们有一些要求,不允许我使用内置的权利,也没有时间来构建他们想要的东西。我计划最终推出一个完整的会员管理系统,但是和你一样,我现在需要一些东西。我选择了以下计划,最终允许我换掉内置的提供程序,以适应我自己的时间限制和截止日期:

我有自己的个人用户表(PT) - MembershipId,UserName,Email,superflous profile info。这是应用程序用于任何用户信息的内容。它是一个类,可以缓存,保存在http上下文,cookie中 - 但是你想要处理你的用户信息。

然后我为身份验证,授权和角色设置了SqlProfileProvider。我不使用配置文件提供程序(即使是琐碎的设置),因为它是MVC的痛苦。我没有对内置提供程序进行任何更改。这就是我用于身份验证和授权的内容。

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

  1. 根据我的规则检查PT的用户名和电子邮件
  2. 创建Guid - MembershipId
  3. 创建MembershipUser,MembershipId是用户名(电子邮件不相关且未使用),用户密码,问题和答案等。
  4. 使用配置文件值在PT中创建用户,并使用MembershipId作为PrimaryKey。
  5. 登录时,我从PT获得MembershipId,使用MembershipId和密码验证会员资格,我已经完成了..

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

    1. 为用户检查PT,确保我可以/应该删除
    2. 获取MemberShipId
    3. 使用交易
    4. 从PT
    5. 删除
    6. User Membership.DeleteUser(MembershipId,true) - 这可确保用户从会员资格和其他aspnet_表中删除
    7. 提交
    8. 它按预期工作:)

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

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

      内置的auth系统非常繁重 - 如果你看一下sprocs,你会看到它通过验证用户的所有箍。我建议最终摆脱它。但是在一个紧张的地方,它做得很好 - 如果你没有一个百万用户,我不认为这是一个问题。

      我没有考虑OpenId,我不确定你如何整合它,虽然我认为你可以做同样的事情,而不是验证实际的凭证(在他们回来验证形式OpenId之后)使用MembershipId登录用户(不要对成员资格进行验证)。

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

答案 2 :(得分:0)

放弃使用SqlMembershipProvider。它真正为您提供的唯一功能是开箱即用的管理界面。它带来的其余部分将是令人讨厌的。

答案 3 :(得分:0)

只需使用sql成员资格提供程序并添加存储过程以更改数据库级别的用户名。