请看每个引语下面的摘要以获取快速答案,以及详细信息的段落。还可以在末尾的参考文献部分查看权威来源。
摘要
1.SimpleMembership/SimpleMembershipProvider(WebMatrix.WebData)是什么,它们负责什么?
SimpleMembership(一个涵盖SimpleMembershipProvider
和SimpleRoleProvider
的术语)负责提供一种干净且快速的方式来实现80%的即插即用身份验证和授权框架,具有安全的密码存储,任何人都可以使用。
2.WebSecurity(WebMatrix.WebData)是什么?
WebSecurity
是一个辅助类,用于常见的成员资格任务,与 OAuthWebSecurity
和 Membership
一起使用。角色仍然通过 Roles
分别访问。
3. 什么是 Membership (System.Web.Security) 类?
Membership
是原始 ASP.NET 成员身份验证实现中的静态类,用于管理用户设置和操作。许多用户操作仍然在此处完成,而不是在 WebSecurity
中重复执行。它们都使用您选择的相同提供程序。
4.MVC4为什么会创建UserProfile表和webpages_Membership表?它们的作用是什么,有什么区别?MVC4创建的UserProfile类是什么?
这两个表执行不同的功能。webpages_Membership架构由框架控制,用于凭据,而UserProfile架构由我们控制,用于存储我们想要存储在用户中的任何属性。
5.UsersContext类是什么?
它是一个DbContext
(DbContext API的一部分),由MVC Internet应用程序模板提供。它的唯一工作是包含UserProfile类,以便我们可以使用它(例如通过InitializeSimpleMembershipAttribute)。
6.所有这些如何共同实现用户身份验证?
这应该从上面的摘要和下面的详细信息中变得明显。常见任务使用
WebSecurity
;用于自定义属性存储在用户中的
UserProfile
,通过
UsersContext
访问(在Visual Studio "MVC Internet Application"模板中);当
WebSecurity
或
OAuthWebSecurity
没有该方法时,使用
Membership
;用于角色的
Roles
。使用VS模板的控制器查看使用示例。
编辑。如果有人走到这一步
假设我有一个现有的数据库...
如果您有一个现有的数据库,并且编写自定义成员资格提供程序的唯一原因是处理旧密码存储方法,则可以使用解决方法。只有在您可以将旧密码存储迁移到SimpleMembership算法(使用
Rfc2898DeriveBytes
类)时,才能起作用。有关详细信息,请参见脚注。
如果您无法更改,那么是的,您将需要创建自己的提供程序来使用特定的密码算法,您可以通过从
SimpleMembershipProvider
派生
来实现。
注意:SimpleMembershipProvider
会对您的密码进行哈希处理而不是加密。如果您不知道这种区别以及为什么它很重要,那么在使用自定义安全性之前请三思。
详情
1. 什么是SimpleMembership/SimpleMembershipProvider
为了理解它们如何相互关联,了解历史背景将会有所帮助。
这是一个开源项目
(在codeplex上)(也可以在
github上找到)。就安全性而言,你可以自己评估代码、克隆它、修改它等等。你应该对
开源安全的
优缺点有
自己的看法,并加入一些
NIH。 (
个人观点:有时我用它,有时我不用)
ExtendedMembershipProvider
本身添加了像
GeneratePasswordResetToken
这样的命令到旧的会员提供者 API 中。
2.WebSecurity(WebMatrix.WebData)是什么?
WebSecurity
只是一个门面或帮助类,提供对SimpleMembershipProvider
的简单访问,并使常见任务变得容易和可访问。它既有助于帮助,也因原始框架通过ExtendedMembershipProvider
的扩展意味着现在一些原始类如Membership
已经不足够。例如:
这些方法通常会延迟到您使用的提供程序,它们不仅依赖于SimpleMembership,还将提供程序和Membership等对象绑定在一起,以提供执行成员资格函数的公共点。
请注意,还有一个
OAuthWebSecurity
,它相当于OAuth身份验证的
WebSecurity
。
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登录提供程序。
这个设置的神奇之处在于,一个用户可以在你自己的网站上拥有会员登录,以及与Google、Facebook等不同供应商的任意数量的OAuth登录,并且它们都共享存储在中的公共配置文件。
通常,如果一个表以开头,那么就表示有一个API可以访问它。在您的中,表由类表示(如果您使用默认的MVC Internet应用程序模板)。因此,我们通过与任何包含在中的类一起使用的通常方法来访问它。
非常适合代码优先:您可以添加列(例如用户的地址),然后设置迁移,以便在下一个发布中将该列包含在您的数据库中(如果您喜欢使用迁移)。实际上,表不必被称为那个名字 - 您可以使用调用、[Table("UserProfile")] public class UserProfile和您自己的迁移来更改它。
5.什么是类?
这是在Visual Studio新项目中提供的MVC Internet应用程序模板。我首先要做的是确保它与我的数据库上下文共享一个常见的连接字符串(假设成员资格表在同一个数据库中)。如果您想要在现在或将来将成员资格信息存储在不同的数据库中,则可以稍后更改此设置并使其解耦。
您不需要将其分开到自己的上下文中 - 只有在您想要立即或将来将成员身份信息存储在不同的数据库中时才需要这样做。如果您将其删除,只需更改对UsersContext的引用以及调整Database.SetInitializer即可。
参考资料:
-
使用SimpleMembership与ASP.NET WebPages - Matthew Osborn
- 这是关于SimpleMembership的原始参考资料,介绍了它是什么、为什么以及它的功能。
-
MSDN - 成员身份简介
- 成员身份仍然是SimpleMembership的核心,因此了解一些相关知识会很有帮助。
编辑 脚注:执行滚动密码升级的详细信息
- 向
UserProfile
添加一个属性,用于存储帐户所在的密码版本(例如,遗留版为1,SimpleMembership版为2)
- 在“登录”操作中,编写代码:
- 如果他们使用的是 SimpleMembership 版本的密码,则进行正常登录
- 如果他们使用的是遗留版密码,则:
- 使用旧方法进行检查
- 如果正确,则使用
ResetPassword
然后使用 ChangePassword
重置密码以使用 SimpleMembership 版本,这将更新字段到新的密码版本
- 最后更新
UserProfile
上的密码版本
- 以类似方式更新任何其他使用密码的 AccountsController 方法。
- 与我们不应该触及的
webpages_Membership
表的 hacky workaround 和耦合一起运行,因为您不必编写新的自定义提供程序。
使用 TransactionScope
可以使所有事务具有事务性。唯一令人讨厌的是控制器中额外的代码和对 webpages_Membership
的耦合。