如何在SimpleMembership和WebSecurity中使用我自己的数据库? 什么是MVC4安全性?
我已经阅读了关于这个主题的所有内容,包括MSDN文章和SOpost,但是我仍然很迷茫和困惑。
问题
请回答以下(如果可能,简要说明):
-
什么是SimpleMembership / SimpleMembershipProvider ( WebMatrix.WebData ),它们是什么?它们负责什么?
-
什么是WebSecurity ( WebMatrix.WebData )?
-
什么是会员 ( System.Web.Security )类?
-
为什么MVC4创build一个UserProfile表和一个webpages_Membership表? 他们是什么,有什么区别? 什么是MVC4创build的UserProfile类?
-
什么是UsersContext类?
-
所有这些如何协同工作来进行用户身份validation?
我的情况
然后这些问题导致下一个问题:
假设我有一个现有的数据库与用户(ID,用户名,密码)。 我创build一个新的MVC4应用程序,并使用窗体身份validation。 用户密码以encryptionforms存储在数据库中(不是bcrypt)。
为了使它与MVC4一起工作,我需要做些什么?
我必须创build一个自定义的MembershipProvider吗?
我的知识到目前为止
据我所知, WebSecurity是一个与MembershipProvider交互的静态类(Module)。 MembershipProvider是一个解释特定函数如何工作的类,比如ValidateUser , CreateUser , ChangePassword 。
为了解决我的问题,我假设我需要创build一个自定义的MembershipProvider,并告诉WebSecurity使用我的新的MembershipProvider。
赏金?
我在这个问题上给予了一个奖励,并打算把它授予安迪·布朗一个杰出的答案。
请参阅每个报价下面的摘要以获得快速回答,以及有关详细信息的段落。 另请参阅最后的权威性来源的参考文献部分。
摘要
1. SimpleMembership / SimpleMembershipProvider(WebMatrix.WebData)是什么?他们负责什么?
SimpleMembership(涵盖SimpleMembershipProvider
和SimpleRoleProvider
)负责提供一个干净而快速的方式实现80%的即插即用身份validation和授权框架,以及任何人都可以使用的安全密码存储。
2.什么是WebSecurity(WebMatrix.WebData)?
WebSecurity
是与Membership
和OAuthWebSecurity
一起使用的常见成员资格任务的助手类。 angular色仍然通过Roles
单独访问。
3. Membership(System.Web.Security)类是什么?
Membership
是来自pipe理用户设置和操作的原始ASP.NET成员资格实施的静态类。 许多用户操作仍然在这里完成,而不是在WebSecurity
重复。 他们都使用您所select的相同提供者。
4.为什么MVC4创build一个UserProfile表和一个webpages_Membership表? 他们是什么,有什么区别? 什么是MVC4创build的UserProfile类?
这两个表执行不同的function。 webpages_Membership
模式由框架控制并用于凭证, UserProfile
模式由我们控制并用于我们要存储的任何属性。
5.什么是UsersContext类?
它是由MVC Internet应用程序模板开始提供的DbContext
( DbContext API的一部分)。 它唯一的工作是包含UserProfile
类,所以我们可以使用它(例如通过InitializeSimpleMembershipAttribute
)。
6.所有这些工作如何共同进行用户authentication?
现在应该从上面的总结和下面的细节中明显看出。 使用: WebSecurity
进行常见任务; UserProfile
用于存储用户的自定义属性,通过UsersContext
(在Visual Studio“MVC Internet Application”模板中)访问; WebSecurity
或OAuthWebSecurity
没有该方法时的Membership
; 和Roles
的angular色。 使用VS模板的控制器来查看使用示例。
编辑 。 如果有人有这么远
假设我有一个现有的数据库…
如果您有一个现有的数据库,并且编写自定义成员资格提供程序的唯一原因是处理您的旧密码存储方法,则可以使用解决方法。 这只有在您可以从旧密码存储转移到SimpleMembershipalgorithm(使用Rfc2898DeriveBytes
类)的情况下才有效。 详见脚注。
如果你不能离开,那么是的,你将不得不创build自己的提供者来使用你的特定的密码algorithm,你可以从SimpleMembershipProvider
派生 。
注意: SimpleMembershipProvider
会散列你的密码不encryption 。 如果你不知道差异,为什么这是重要的,那么在做自己的定制安全提供商之前要三思而后行
详情
1.什么是SimpleMembership / SimpleMembershipProvider
要理解这一切如何融合在一起,有助于理解历史。
- ASP.NET在2005年推出了ASP.NET Membership系统
- 这个系统使用提供者从用于pipe理帐户和angular色等的常用接口抽象出实现细节。
- 它也给了我们一个基本的“用户configuration文件”能力(存储在一个单独的列xml字段中,因此人们倾向于避免)
- SimpleMembership在2010年被发布到世界上,作为一个提供者,可以插入ASP.NET成员资格系统,但也允许OAuth身份validation和每列属性用户configuration文件存储(而不是原始的单列存储实现)。
-
SimpleMembershipProvider
实现ExtendedMembershipProvider
以扩展原始的提供者实现
它是codeplex 上的开源( 在github 上镜像)。 就安全性而言,您可以自己评估代码,克隆代码,更改代码等等。您应该对开源安全性的好处和缺点有自己的看法 ,并且只需要一小撮NIH即可 。 ( 个人观点:我有时使用它,其他时间我不使用它 )
ExtendedMembershipProvider
本身向旧的成员资格提供者apis添加了像GeneratePasswordResetToken
这样的命令。
2.什么是WebSecurity(WebMatrix.WebData)?
WebSecurity
只是一个Facade或Helper类,用于提供对SimpleMembershipProvider
简单访问,并使普通任务轻松便捷。 它既有帮助,又因为通过ExtendedMembershipProvider
原始框架意味着像Membership
这样的一些原始类是不够的。 例子:
-
WebSecurity.CurrentUserName
– 获取当前login用户的名称 -
WebSecurity.CreateUserAndAccount
。 同时创build一个用户并设置用户configuration文件属性(例如WebSecurity.CreateUserAndAccount(userName, pw, new { Email = model.Email });
-
WebSecurity.InitializeDatabaseConnection
– 快速设置一个新的/现有的数据库用于成员身份,select你的用户ID列和用户自然键标识符等。 -
ResetPassword
重置用户密码,GeneratePasswordResetToken
等等
这些方法一般都遵从你所使用的提供者 ,他们不仅仅依赖于SimpleMembership,而且他们把你的提供者和Membership
等对象联系在一起,提供一个共同点来完成成员函数。
请注意,还有OAuthWebSecurity
等同于WebSecurity
进行OAuth身份validation。
3. Membership(System.Web.Security)类是什么?
Membership
来自原始实施; 它使用ExtendedMembershipProvider
现在扩展的基本MembershipProvider
实现来pipe理用户设置并执行与用户相关的操作。 它是一个静态类,因此可以在声明名称空间的任何位置使用,因此可以轻松地获取当前用户: Membership.GetUser
由于WebSecurity
做了一些事情而不是其他事情,而Membership
做了一些事情,而不是其他事情,所以造成了混淆。 如果您将WebSecurity
视为更高级别操作的工具包,并将Membership
作为工具包向用户执行操作,那么您就可以; 他们一起在你的提供者上工作。
4.为什么MVC4创build一个UserProfile表和一个webpages_Membership表? 他们是什么,有什么区别? 什么是MVC4创build的UserProfile类?
-
webpages_Membership
是一个固定模式的表格,我们可以单独离开,并允许提供者执行基本的账户操作,主要存储凭证。 -
UserProfile
是我们定制的一个表,用于存储用户帐户的信息,并通过UserProfile
类以强types格式提供。 - 还有一个名为
webpages_OAuthMembership
的额外表格,它与webpages_OAuthMembership
完成相同的工作,但对于要与其集成的OAuthlogin提供程序来说,这个表格是完全相同的。
这种设置的神奇之处在于,一个用户可以在自己的网站上拥有一个成员资格login,并且任何数量的OAuthlogin都可以使用不同的提供者(如google,facebook),并且它们都共享一个存储在UserProfile
的公共configuration文件
一般情况下,如果一个表以webpages_
开头,就意味着有一个API来访问它。 UserProfile
表由UserProfile
中的UserProfile
类表示(如果使用默认的MVC Internet应用程序模板)。 因此,我们通过常用的方法来访问这个方法,我们将使用包含在DbContext
任何类。
UserProfile
非常友好:您可以添加列(如用户的Email
地址),然后设置迁移,以便在下一个版本的数据库中包含该列(如果您喜欢使用迁移)。 实际上, UserProfile
表不必被调用 – 您可以使用WebSecurity.InitializeDatabaseConnection
调用, [Table("UserProfile")] public class UserProfile
和您自己的迁移来更改该[Table("UserProfile")] public class UserProfile
。
5.什么是UsersContext类?
这是来自Visual Studio New Project中提供的MVC Internet应用程序模板。 我做的第一件事是确保它与我自己的数据库上下文共享一个公共的连接string(假设成员表在同一个数据库中)。 如果需要,可以稍后更改并解耦。
你不需要把它和你自己的上下文分开 – 只有当你想要将会员信息存储在不同的数据库中或现在或将来时,才有必要。如果你摆脱了它,你可以把对UsersContext
引用改为你自己的上下文,调整Database.SetInitializer
。
参考文献:
在ASP.NET WebPages中使用SimpleMembership – Matthew Osborn – 这是关于SimpleMembership的原始参考,它是什么,为什么是这样,它是什么:
MSDN – 成员介绍 – 成员资格仍然是SimpleMembership的核心,所以有助于理解它。
- codeplex源 ( 在github镜像)。
-
WebSecurity
-
OAuthWebSecurity
-
SimpleMembershipProvider
-
ExtendedMembershipProvider
-
SimpleRoleProvider
-
Membership
-
Roles
-
DbContext
和DbContext API
编辑脚注:滚动密码升级的细节
- 将属性添加到
UserProfile
,该属性存储帐户所在的密码版本(例如1代表旧版,2代表SimpleMembership) - 在“login”操作中,编写代码以便:
- 如果他们在您的SimpleMembership密码版本上,则执行正常的login
- 如果他们在传统密码版本上,则:
- 检查它使用你的旧方法
- 如果它是正确的,则使用
ResetPassword
重置它,然后ChangePassword
使用SimpleMembership版本,这会将该字段更新为新的密码版本 - 最后更新
UserProfile
上的密码版本
- 以类似方式更新使用密码的其他AccountsController方法。
- 住hacky解决方法,并耦合到
webpages_Membership
表,我们不打算触摸,因为你没有写一个新的自定义提供程序。
使用TransactionScope
可以完成所有这些TransactionScope
。 唯一令人讨厌的事情是控制器中的额外代码,以及与webpages_Membership
的耦合。