首页 文章

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

提问于
浏览
61

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

问题

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

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

  • 什么是 WebSecurity (WebMatrix.WebData)?

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

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

  • 什么是 UsersContext 班?

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

我的情况

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

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

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

我是否必须创建自定义MembershipProvider?

我的知识迄今为止

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

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

赏金?

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

1 回答

  • 183

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

    摘要

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

    SimpleMembership(涵盖SimpleMembershipProviderSimpleRoleProvider的术语)负责提供一种干净,快速的方法来实现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类?

    它是DbContextDbContext API的一部分),由MVC Internet Application模板提供 . 它唯一的工作是包含 UserProfile 类,以便我们可以使用它(例如通过 InitializeSimpleMembershipAttribute ) .

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

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

    Edit . 如果有人得到这么远

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

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

    如果您无法离开,那么是的,您将不得不创建自己的提供商以使用您的特定密码算法,您可以这样做by deriving from SimpleMembershipProvider .

    NOTE: SimpleMembershipProvider will HASH your passwords not ENCRYPT them. If you don't know the difference and why that is important then think twice before doing your own provider with custom security


    细节

    1.什么是SimpleMembership / SimpleMembershipProvider

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

    • 2005年的ASP.NET introduced the ASP.NET Membership system

    • 该系统使用提供程序从用于管理帐户和角色等的通用接口中抽象出实现细节 .

    • 它还给了我们一个基本的"user profile"能力(存储在单列xml字段中,人们因此倾向于避免)

    • SimpleMembership在2010年作为一个提供商插入到ASP.NET会员系统中,但也允许进行OAuth身份验证和每列属性用户配置文件存储(而不是单列存储使用原始实施) .

    • SimpleMembershipProvider实现ExtendedMembershipProvider以扩展原始提供程序实现

    它是开源on codeplex(镜像on github) . 就安全性而言,你可以自己评估代码,克隆它,改变它等等 . 你应该在benefits and drawbacksbenefits and drawbacks上取your own view,然后用一小撮NIH来做 . (个人观点:我有时使用它,其他时候不使用它)

    ExtendedMembershipProvider 本身将像 GeneratePasswordResetToken 这样的命令添加到旧的成员资格提供者apis中 .

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

    WebSecurity只是一个Facade或helper类,可以提供对 SimpleMembershipProvider 的简单访问,并使常见任务在一个地方变得简单易用 . 它有两个帮助,因为原始框架的扩展通过 ExtendedMembershipProvider 意味着一些原始类如 Membership 现在还不够 . 例子:

    这些方法通常遵循您正在使用的提供程序,它们不仅依赖于SimpleMembership,而且它们将诸如提供程序和 Membership 之类的对象绑定在一起,以提供执行成员函数的公共点 .

    请注意,还有OAuthWebSecurity,相当于 WebSecurity 用于OAuth身份验证 .

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

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

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

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

    • webpages_Membership 是一个具有固定架构的表,我们单独留下,并允许提供程序执行基本帐户操作,主要是存储凭据 .

    • UserProfile 是我们自定义的表,用于存储针对用户帐户的信息,并通过 UserProfile 类以强类型格式提供该表 .

    • 有一个名为 webpages_OAuthMembership 的额外表,它与 webpages_Membership 执行相同的工作,但对于要与之集成的OAuth登录提供程序 .

    这种设置的神奇之处在于,单个用户可以在您自己的网站上拥有会员登录,并且可以使用不同的提供商(如google,facebook)进行任意数量的OAuth登录,并且这些登录共享存储在 UserProfile 中的公共 Profiles

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

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

    5.什么是UsersContext类?

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

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

    References:

    Using SimpleMembership With ASP.NET WebPages - Matthew Osborn - 这是关于SimpleMembership的原始参考资料及其含义,原因以及它的作用:

    MSDN - Introduction to Membership - 成员资格仍然是SimpleMembership的核心,因此有助于理解它 .


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

    • 将属性添加到 UserProfile ,该属性存储帐户所在的密码版本(例如,1表示遗留,2表示简单成员)

    • 在"Login"操作中,编写代码以便:

    • 如果它们在您的SimpleMembership密码版本上,则进行正常登录

    • 如果他们使用旧密码版本,您:

    • 使用旧方法检查它

    • 如果正确则使用 ResetPassword 然后 ChangePassword 重置它以使用SimpleMembership版本,这会将字段更新为新密码版本

    • 并最终更新 UserProfile 上的密码版本

    • 更新以类似方式使用密码的任何其他AccountController方法 .

    • 与hacky变通方法一起生活并且耦合到 webpages_Membership 表我们不打算触摸,因为您不必编写新的自定义提供程序 .

    可以使用TransactionScope进行所有此事务处理 . 唯一令人讨厌的事情是控制器中的额外代码,以及与 webpages_Membership 的耦合 .

相关问题