3

我一直在思考如何解决在使用ASP.NET MVC时实现基于ID的用户系统的问题。我的目标,很像StackOverflow的系统如下:如何在ASP.NET MVC中实现基于ID的用户系统(成员资格,授权等)?

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

我想避免尽可能多的返工,所以我起初想到使用会员,角色和(可能)配置文件提供程序,但我发现它们是基于用户名的。 我想通过使用username字段来存储ID并在基于密码的方法之类抛出UnsupportedException等,以便能够使用其他系统,从而使适配器脱离SqlMembershipProvider。但它感觉很笨重和笨拙(如果可能的话)。另一方面,也许我应该卷起自己的用户系统,但我不确定如果即使我不能使用提供者,我仍然可以使用MVC的一些功能(将我的代码与MVC 某处,我可以把AuthorizeAttribute想象成我的头顶)。

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

越详细越好!

回答

2

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

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

然后,我为身份验证,授权和角色设置了SqlProfileProvider。我不使用配置文件提供程序(即使是微不足道的设置),因为这是MVC中的一个痛苦。我没有改变内置的提供者。这是我用于身份验证和授权的内容。

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

  • 创建GUID

    1. 检查PT用户名和电子邮件,按我的规则 - MembershipId
    2. 创建的MembershipUser,该MembershipId是用户名(电子邮件是不相关的,不使用)以及用户密码,问题和答案等。
    3. 使用配置文件值在PT中创建用户并使用MembershipId作为PrimaryKey。

    在登录时,我从PT的MembershipId,验证对成员与MembershipId和密码,我做..

    当删除一个用户,我做到以下几点:

    1. 检查PT用户,确保我能/应删除
    2. 获取MemberShipId
    3. 使用事务
    4. 从PT
    5. 用户Membership.DeleteUser(MembershipId,真)删除 - 这确保了用户从德籍和其他aspnet_表
    6. 删除提交

    而且它按预期工作: )

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

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

    内置的认证系统真的很沉重 - 如果你看看sprocs,你会看到它所经历的所有环节来验证用户。我建议最终摆脱它。但是在一个狭窄的地方,它做得很好 - 如果你没有一个千万用户,我不认为这会是一个问题。

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

    对我来说,背后的主要观点是应用程序使用自定义用户模型,允许对用户名,电子邮件,名称等进行更改而不影响授权和角色。当我准备转换到完整的系统时,我可以改变它,而不必担心对应用程序的影响。

  • 0

    放弃使用SqlMembershipProvider。它真正为您提供的唯一一件开箱即用的管理界面。其余的它会带来麻烦。

    0

    只需使用sql成员资格提供程序并添加一个存储的proc即可在数据库级别更改用户名。

    相关问题