请参阅每个引文下面的摘要以获得快速答案,并参阅段落以了解详细信息。另请参阅最后的参考文献部分以获取权威来源。
摘要
1.什么是SimpleMembership/SimpleMembershipProvider (WebMatrix.WebData),它们负责什么?
SimpleMembership(这个术语涵盖了SimpleMembershipProvider http://msdn.microsoft.com/en-us/library/webmatrix.webdata.simplemembershipprovider%28v=vs.111%29.aspx and SimpleRoleProvider http://msdn.microsoft.com/en-us/library/webmatrix.webdata.simpleroleprovider%28v=vs.111%29.aspx)负责提供一种干净、快速的方法来实现 80% 即插即用的身份验证和授权框架,并具有安全的密码存储,任何人都可以使用。
2.什么是WebSecurity(WebMatrix.WebData)?
WebSecurity http://msdn.microsoft.com/en-us/library/gg547905%28v=vs.111%29.aspx是一个用于常见成员资格任务的辅助类,与Membership
and OAuthWebSecurity http://msdn.microsoft.com/en-us/library/microsoft.web.webpages.oauth.oauthwebsecurity%28v=vs.111%29.aspx。角色仍然可以通过单独访问Roles http://msdn.microsoft.com/en-us/library/system.web.security.roles.aspx.
3.什么是Membership (System.Web.Security)类?
Membership http://msdn.microsoft.com/en-us/library/system.web.security.membership.aspx是来自原始 ASP.NET 成员资格实现的静态类,用于管理用户设置和操作。很多用户操作还是在这里完成,而不是在里面重复WebSecurity
。他们都使用您选择的同一提供商。
4.为什么MVC 4要创建User Profile表和网页Membership表?它们的用途是什么以及有什么区别? MVC4 创建的 UserProfile 类是什么?
这两个表执行不同的功能。这webpages_Membership
模式由框架控制并用于凭证,UserProfile
模式由我们控制并用于我们想要针对用户存储的任何属性。
5.什么是UsersContext类?
It is a DbContext http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext%28v=vs.103%29.aspx(的一部分数据库上下文API http://msdn.microsoft.com/en-us/data/gg192989.aspx)作为 MVC Internet 应用程序模板的起始部分提供。它唯一的工作就是遏制UserProfile
类,以便我们可以使用它(例如通过InitializeSimpleMembershipAttribute
).
6.所有这些如何协同工作来进行用户身份验证?
从上面的总结和下面的细节中现在应该可以明显看出这一点。使用:WebSecurity
用于常见任务;UserProfile
用于针对用户存储的自定义属性,通过UsersContext
(在 Visual Studio“MVC Internet 应用程序”模板中);Membership
when WebSecurity
or OAuthWebSecurity
没有方法;和Roles
对于角色。使用VS模板的控制器查看使用示例。
Edit。万一有人走到这一步
假设我有一个现有的数据库......
如果您有现有数据库,并且编写自定义成员资格提供程序的唯一原因是处理旧密码存储方法,那么您可以使用解决方法。仅当您可以从旧密码存储转移到 SimpleMembership 算法(该算法使用Rfc2898DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx班级)。详细信息请参见脚注。
如果您无法离开,那么您将必须创建自己的提供商来使用您的特定密码算法,您可以这样做通过派生自SimpleMembershipProvider http://weblogs.asp.net/thangchung/archive/2012/11/15/customize-the-simplemembership-in-asp-net-mvc-4-0.aspx.
NOTE: SimpleMembershipProvider
will 对您的密码进行哈希处理而不是加密它们 https://stackoverflow.com/a/4948393/1831275。如果您不知道其中的区别以及为什么这很重要,那么在使用自定义安全性为您自己的提供商提供服务之前请三思而后行
Detail
1.什么是SimpleMembership/SimpleMembershipProvider
要了解这一切是如何结合在一起的,有助于了解历史。
- 2005 年的 ASP.NET引入 ASP.NET 会员系统 http://msdn.microsoft.com/en-us/library/yh26yfzy%28v=vs.80%29.aspx
- 该系统使用提供者从用于管理帐户和角色等的通用接口中抽象出实现细节。
- 它还为我们提供了基本的“用户配置文件”功能(存储在单列 xml 字段中,因此人们倾向于避免使用)
- SimpleMembership 于 2010 年作为一个提供者发布到世界各地,它可以插入 ASP.NET 会员系统,但也允许 OAuth 身份验证和每列属性用户配置文件存储(而不是原始中使用的单列存储)执行)。
-
SimpleMembershipProvider http://msdn.microsoft.com/en-us/library/webmatrix.webdata.simplemembershipprovider%28v=vs.111%29.aspx实施ExtendedMembershipProvider http://msdn.microsoft.com/en-us/library/webmatrix.webdata.extendedmembershipprovider%28v=vs.111%29.aspx扩展原始提供者的实现
它是开源的在 Codeplex 上 https://aspnetwebstack.codeplex.com/(镜像在 github 上 https://github.com/ASP-NET-MVC/aspnetwebstack)。因此,就安全性而言,您可以自己评估代码、克隆它、更改它等。您应该采取你自己的看法 http://www.zdnet.com/six-open-source-security-myths-debunked-and-eight-real-challenges-to-consider-7000014225/ on the 优点和缺点 http://www.schneier.com/blog/archives/2011/06/open-source_sof.html of 开源安全 http://en.wikipedia.org/wiki/Open-source_software_security,然后用一小撮把它煮起来NIH http://en.wikipedia.org/wiki/Not_invented_here#In_computing. (个人看法:我有时用,其他时候不用)
ExtendedMembershipProvider
其本身添加了类似的命令GeneratePasswordResetToken
到旧的会员提供商 API。
2.什么是WebSecurity(WebMatrix.WebData)?
WebSecurity http://msdn.microsoft.com/en-us/library/gg547905%28v=vs.111%29.aspx只是一个外观或辅助类,用于提供简单的访问SimpleMembershipProvider
使常见任务在一个地方变得简单且易于访问。它的存在既是为了提供帮助,也是因为通过扩展原始框架ExtendedMembershipProvider
意味着一些原始的类,例如Membership
现在还不够。例子:
-
WebSecurity.CurrentUserName http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity.currentusername%28v=vs.111%29.aspx- 获取当前登录用户的名称
-
WebSecurity.CreateUserAndAccount http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity.createuserandaccount%28v=vs.111%29.aspx。同时创建用户并设置用户配置文件属性(例如
WebSecurity.CreateUserAndAccount(userName, pw, new { Email = model.Email });
-
WebSecurity.InitializeDatabaseConnection http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity.initializedatabaseconnection%28v=vs.111%29.aspx- 快速设置新的/现有的数据库以供会员使用,选择您的用户 ID 列和用户自然密钥标识符等。
-
ResetPassword
重置用户密码,GeneratePasswordResetToken
还有很多
这些方法一般会推迟给您正在使用的提供商,它们不仅仅依赖于 SimpleMembership,而且它们将像您的提供者和Membership
提供共同点做会员功能。
注意还有OAuthWebSecurity http://msdn.microsoft.com/en-us/library/microsoft.web.webpages.oauth.oauthwebsecurity%28v=vs.111%29.aspx这相当于WebSecurity
用于 OAuth 身份验证。
3.什么是Membership (System.Web.Security)类?
Membership
来自原始实现;它使用基本的管理用户设置并执行与用户相关的操作MembershipProvider
实施其中ExtendedMembershipProvider
现在延伸。它是一个静态类,因此在声明命名空间的任何地方都可用,因此是一种简单的方法,例如检索当前用户:Membership.GetUser
造成混乱的原因是WebSecurity
做一些事情而不做其他事情,并且Membership
做一些事情而不做其他事情。如果您查看WebSecurity
作为更高级别操作的工具包,以及Membership
作为一个为用户做事的工具包,你会没事的;他们在您的提供商上共同工作。
4.为什么MVC 4要创建User Profile表和网页Membership表?它们的用途是什么以及有什么区别? MVC4 创建的 UserProfile 类是什么?
-
webpages_Membership
是一个具有固定模式的表,我们将其保留,并允许提供者执行基本帐户操作,主要是存储凭据。
-
UserProfile
是一个我们定制的表,用于存储针对用户帐户的信息,并通过以下方式以强类型格式提供该表:UserProfile
class.
- 有一个额外的表称为
webpages_OAuthMembership
其作用与webpages_Membership
,但对于您想要集成的 OAuth 登录提供程序。
此设置的神奇之处在于,单个用户可以在您自己的网站上进行会员登录,并且可以使用不同的提供商(例如 google、facebook)进行任意数量的 OAuth 登录,并且它们都共享存储在UserProfile
一般来说,如果一个表以webpages_
,这意味着有一个API可以访问它。这UserProfile
表由UserProfile
你的班级UsersContext
(如果您使用默认的 MVC Internet 应用程序模板)。因此,我们通过与包含在 a 中的任何类一起使用的常用方法来访问它。DbContext
.
UserProfile
对代码优先非常友好:您可以添加列(例如用户的Email
地址),然后设置迁移以在下一个版本中将该列包含在数据库中(如果您喜欢使用迁移)。事实上,UserProfile
表不必这样称呼 - 您可以使用以下命令更改它WebSecurity.InitializeDatabaseConnection
call, [Table("UserProfile")] public class UserProfile
,以及您自己的迁移。
5.什么是UsersContext类?
这是来自 Visual Studio 新项目中提供的 MVC Internet 应用程序模板。我做的第一件事是确保它与我自己的数据库上下文共享一个公共连接字符串(假设成员资格表位于同一数据库中)。如果需要,您可以更改此设置并稍后将它们解耦。
您不需要将其与您自己的上下文分开 - 仅当您现在或将来想将成员资格信息存储在不同的数据库中时才有必要如果您摆脱它,您只需将引用更改为UsersContext
根据自己的情况,调整Database.SetInitializer
.
参考:
在 ASP.NET 网页中使用 SimpleMembership - Matthew Osborn http://blog.osbornm.com/2010/07/21/using-simplemembership-with-asp.net-webpages- 这是有关 SimpleMembership 及其含义、原因和作用的原始参考资料:
MSDN - 会员资格简介 http://msdn.microsoft.com/en-us/library/yh26yfzy%28v=vs.80%29.aspx- 会员资格仍然是 SimpleMembership 的核心,因此了解一下它会有所帮助。
-
代码复合源 https://aspnetwebstack.codeplex.com/(镜像在 github 上 https://github.com/ASP-NET-MVC/aspnetwebstack).
- WebSecurity http://msdn.microsoft.com/en-us/library/gg547905%28v=vs.111%29.aspx
- OAuthWebSecurity http://msdn.microsoft.com/en-us/library/microsoft.web.webpages.oauth.oauthwebsecurity%28v=vs.111%29.aspx
- SimpleMembershipProvider http://msdn.microsoft.com/en-us/library/webmatrix.webdata.simplemembershipprovider%28v=vs.111%29.aspx
- ExtendedMembershipProvider http://msdn.microsoft.com/en-us/library/webmatrix.webdata.extendedmembershipprovider%28v=vs.111%29.aspx
- SimpleRoleProvider http://msdn.microsoft.com/en-us/library/webmatrix.webdata.simpleroleprovider%28v=vs.111%29.aspx
- Membership http://msdn.microsoft.com/en-us/library/system.web.security.membership.aspx
- Roles http://msdn.microsoft.com/en-us/library/system.web.security.roles.aspx
-
DbContext http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext%28v=vs.103%29.aspx和数据库上下文API http://msdn.microsoft.com/en-us/data/gg192989.aspx
EDIT脚注:滚动密码升级的详细信息
- 添加属性到
UserProfile
它存储帐户所在的密码版本(例如 1 表示旧版,2 表示 SimpleMembership)
- In the "Login" Action, write code so that:
- 如果它们在您的 SimpleMembership 密码版本上,您可以正常登录
- If they are on the legacy password version, you:
- 使用您的旧方法检查它
- 如果它是正确的,您可以使用重置它
ResetPassword
then ChangePassword
要使用 SimpleMembership 版本,这会将字段更新为新密码版本
- 最后更新密码版本
UserProfile
- 以类似方式更新使用密码的任何其他 AccountsController 方法。
- 接受 hacky 解决方法并耦合到
webpages_Membership
我们不打算触及该表,因为您不必编写新的自定义提供程序。
可以使所有这些事务化TransactionScope http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx。唯一令人讨厌的事情是控制器中的额外代码以及与webpages_Membership
.