如何在SimpleMembership和WebSecurity中使用自己的数据库?什么是MVC4安全性?

Row*_*man 61 forms-authentication asp.net-membership membership-provider asp.net-mvc-4 simplemembership

我已经阅读了我能找到的关于这个主题的所有内容,包括MSDN文章和SO帖子,但我仍然非常迷茫和困惑.

问题

请回答以下内容(如果可能,请简要回答):

  1. 什么是SimpleMembership/SimpleMembershipProvider(WebMatrix.WebData)以及它们负责的是什么?

  2. 什么是WebSecurity(WebMatrix.WebData)?

  3. 什么是Membership(System.Web.Security)类?

  4. 为什么MVC4会创建一个UserProfile表和一个webpages_Membership表?它们是什么,有什么区别?MVC4创建的UserProfile类是什么?

  5. 什么是UsersContext类?

  6. 所有这些如何协同工作以进行用户身份验证?

我的情况

这些问题然后导致下一个问题:

假设我有一个包含用户的现有数据库(ID,用户名,密码).我正在创建一个新的MVC4应用程序并使用表单身份验证.用户密码以加密形式(不是bcrypt)存储在数据库中.

我需要做些什么才能使它与MVC4一起使用?

我是否必须创建自定义MembershipProvider

我的知识远远不够

据我所知,WebSecurity是一个静态类(Module),它与MembershipProvider交互.MembershipProvider是一个解释特定函数如何工作的类,例如ValidateUser,CreateUser,ChangePassword.

为了解决我的问题,我假设我需要创建一个自定义MembershipProvider并告诉WebSecurity使用我的新MembershipProvider.

赏金?

我已经在这个问题上获得了赏金,并打算将其授予安迪·布朗,以获得出色的答案.

And*_*own 186

有关快速答案,请参阅每个引用下面的摘要,以及详细信息的段落.另请参阅最后的参考部分以获取权威来源.

摘要

1.什么是SimpleMembership/SimpleMembershipProvider(WebMatrix.WebData)以及它们负责的是什么?

SimpleMembership(一个涵盖SimpleMembershipProvider和的术语SimpleRoleProvider)负责提供一种干净,快速的方法来实现80%的即插即用认证和授权框架以及任何人都可以使用的安全密码存储.

2.什么是WebSecurity(WebMatrix.WebData)?

WebSecurity是的作品一起普通会员任务的辅助类MembershipOAuthWebSecurity.角色仍然可以单独访问Roles.

3.什么是Membership(System.Web.Security)类?

Membership是原始ASP.NET成员资格实现中的静态类,用于管理用户设置和操作.许多用户操作仍然在这里完成,而不是重复它们WebSecurity.他们都使用您选择的相同提供商.

4.为什么MVC4会创建UserProfile表和webpages_Membership表?它们是什么,有什么区别?MVC4创建的UserProfile类是什么?

这两个表执行不同的功能.该webpages_Membership模式由控制框架并用于凭据,该UserProfile架构是由我们控制,用于我们想要存储对用户的任何属性.

5. UsersContext类是什么?

它是作为MVC Internet应用程序模板的开头提供的DbContext(DbContext API的一部分).它唯一的工作是包含UserProfile类,以便我们可以使用它(例如通过InitializeSimpleMembershipAttribute).

6.所有这些如何协同工作以进行用户身份验证?

现在从上面的摘要和下面的细节中可以看出这一点.用途:WebSecurity用于常见任务; UserProfile用于存储针对用户的自定义属性,通过UsersContext(在Visual Studio"MVC Internet应用程序"模板中)访问; Membership何时WebSecurityOAuthWebSecurity没有这种方法; 和Roles角色.使用VS模板的控制器查看使用示例.

编辑.如果有人得到这么远

假设我有一个现有的数据库......

如果您有现有数据库,并且编写自定义成员资格提供程序的唯一原因是处理旧密码存储方法,则可以使用变通方法.只有在您可以从旧密码存储转移到SimpleMembership算法(使用Rfc2898DeriveBytes该类)时,这才有效.有关详细信息,请参阅脚注.

如果您无法离开,那么是的,您将不得不创建自己的提供商以使用您的特定密码算法,您可以通过派生来实现SimpleMembershipProvider.

注意:SimpleMembershipProviderHASH您的密码没有加密它们.如果你不知道差异以及为什么这很重要,那么在使用自定义安全性做自己的提供者之前要三思而后行


详情

1.什么是SimpleMembership/SimpleMembershipProvider

要了解它们如何组合在一起,有助于理解历史.

  • ASP.NET于2005年推出了ASP.NET Membership系统
  • 该系统使用提供程序从用于管理帐户和角色等的通用接口中抽象出实现细节.
  • 它还为我们提供了一个基本的"用户配置文件"功能(存储在单列xml字段中,因此人们倾向于避免)
  • SimpleMembership在2010年作为提供商插入到ASP.NET会员系统中,但也允许OAuth身份验证和每列属性用户配置文件存储(而不是原始的单列存储)实现).
  • SimpleMembershipProvider实现ExtendedMembershipProvider扩展原始提供程序实现

它是codeplex 上的开源(在github 镜像).因此,就安全性而言,您可以自己评估代码,克隆代码,更改代码等.您应该对开源安全性的优缺点进行自己的观察,并用一小撮NIH来做好准备.(个人观点:我有时使用它,其他时候不使用它)

ExtendedMembershipProvider本身添加GeneratePasswordResetToken了与旧的成员资格提供者apis 相似的命令.

2.什么是WebSecurity(WebMatrix.WebData)?

WebSecurity它只是一个外观或辅助类,SimpleMembershipProvider可以在一个地方提供简单的访问并使常见任务变得容易和可访问.它既有帮助,又因为原始框架的扩展ExtendedMembershipProvider意味着一些原始的类Membership现在还不够.例子:

这些方法通常遵循您正在使用的提供程序,它们不仅依赖于SimpleMembership,而且它们将提供程序等对象绑定在一起,并Membership提供执行成员身份功能的公共点.

请注意,还有OAuthWebSecurity一个WebSecurity与OAuth身份验证相同的内容.

3.什么是Membership(System.Web.Security)类?

Membership来自最初的实施; 它使用现在扩展的基本MembershipProvider实现来管理用户设置并执行与用户相关的操作ExtendedMembershipProvider.它是一个静态类,因此可以在声明命名空间的任何地方使用,因此是一种简单的方法,例如,检索当前用户:Membership.GetUser

由于WebSecurity做了一些事情而不Membership做其他事情,并做了一些事情而不做其他事情,这引起了混乱.如果您将其WebSecurity视为更高级别操作Membership的工具包,并将其视为向用户执行操作的工具包,那么您就可以了.他们在您的提供商上一起工作.

4.为什么MVC4会创建UserProfile表和webpages_Membership表?它们是什么,有什么区别?MVC4创建的UserProfile类是什么?

  • webpages_Membership 是一个具有固定架构的表,我们单独留下,并允许提供程序执行基本帐户操作,主要是存储凭据.
  • UserProfile是一个我们自定义的表,用于存储针对用户帐户的信息,并通过UserProfile该类以强类型格式提供.
  • 有一个额外的表叫做webpages_OAuthMembership同样的工作webpages_Membership,但是对于要集成的OAuth登录提供程序.

这种设置的神奇之处在于,单个用户可以在您自己的网站上拥有会员登录,并且具有不同提供商的任意数量的OAuth登录,例如google,facebook,并且它们都共享存储在 UserProfile

通常,如果表格以表格开头webpages_,则表示有一个API可以访问它.该UserProfile表由UserProfile您的类表示UsersContext(如果您使用默认的MVC Internet应用程序模板).因此,我们通过我们将用于包含在a中的任何类的常用方法来访问它DbContext.

UserProfile是非常友好的代码:您可以添加列(如用户的Email地址),然后设置迁移以在下一个版本的数据库中包含该列(如果您喜欢使用迁移).实际上,UserProfile不必调用该表 - 您可以使用WebSecurity.InitializeDatabaseConnection调用[Table("UserProfile")] public class UserProfile和您自己的迁移来更改该表.

5. UsersContext类是什么?

这来自Visual Studio New Project中提供的MVC Internet Application模板.我要做的第一件事是确保它与我自己的数据库上下文共享一个公共连接字符串(假设成员资格表在同一个数据库中).如果需要,您可以更改此设置并在以后将其分离.

您不需要将它与您自己的上下文分开 - 只有当您想要在现在或将来将成员资格信息存储在不同的数据库中时才需要它如果您摆脱它,您只需将引用更改UsersContext为您自己的上下文,调整Database.SetInitializer.

参考文献:

在ASP.NET WebPages中使用SimpleMembership - Matthew Osborn - 这是关于SimpleMembership的原始参考资料及其内容,原因以及它的作用:

MSDN - 会员简介 - 会员资格仍然是SimpleMembership的核心,因此有助于理解它.


编辑脚注:进行滚动密码升级的详细信息

  • 添加一个属性,UserProfile用于存储帐户所在的密码版本(例如,1表示遗留,2表示简单成员)
  • 在"登录"操作中,编写代码以便:
    • 如果它们在您的SimpleMembership密码版本上,则进行正常登录
    • 如果它们是旧版密码版本,您:
      • 使用旧方法检查它
      • 如果它是正确的,ResetPasswordChangePassword使用SimpleMembership版本重置它,这会将字段更新为新的密码版本
      • 最后更新密码版本 UserProfile
  • 以类似的方式更新使用密码的任何其他AccountController方法.
  • 与hacky解决方案一起生活并与webpages_Membership表格耦合,我们不打算触摸,因为您不必编写新的自定义提供程序.

有可能使所有这些交易TransactionScope.唯一令人讨厌的事情是控制器中的额外代码和耦合webpages_Membership.

  • 很好的答案.我希望更多的人看到它. (2认同)