如何将我自己的数据库与 SimpleMembership 和 WebSecurity 结合使用? MVC4 安全性到底是什么?

2024-04-18

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

问题

请回答以下问题(如果可能的话,请简要回答):

  1. What is SimpleMembership/SimpleMembershipProvider (WebMatrix.WebData)以及他们负责什么?

  2. What is 网络安全 (WebMatrix.WebData)?

  3. 是什么会员资格 (系统.Web.安全) class?

  4. 为什么MVC4创建一个用户资料表和一个网页_会员资格桌子?它们的用途是什么以及有什么区别? MVC4 创建的 UserProfile 类是什么?

  5. 是什么用户上下文 class?

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

我的情况

这些问题又引出了下一个问题:

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

我需要做什么才能使其与 MVC4 一起工作?

我必须创建一个自定义的吗会员提供者?

到目前为止我的知识

据我所知,网络安全是一个静态类(模块),与会员提供者。 MembershipProvider 是一个解释特定函数如何工作的类,例如验证用户, 创建用户, 更改密码.

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

Bounty?

我已对这个问题悬赏,并打算将其奖励给安迪·布朗,以表彰其出色的回答。


请参阅每个引文下面的摘要以获得快速答案,并参阅段落以了解详细信息。另请参阅最后的参考文献部分以获取权威来源。

摘要

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将我自己的数据库与 SimpleMembership 和 WebSecurity 结合使用? MVC4 安全性到底是什么? 的相关文章

  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing
  • 在 VS2008 的 XAML 编辑器中禁用 Intellisense?

    有没有办法在 Visual Studio 2008 的 XAML 编辑器中禁用 Intellisense 打字时通常会消耗很大的性能 有时我会等待十秒或更长时间 直到列表自动弹出 似乎在 选项 gt 文本编辑器 gt XAML 中 Inte
  • 查询联系人 - 有时返回空游标

    我正在尝试查询联系人的显示名称 Override public void onActivityResult int requestCode int resultCode Intent data switch requestCode case
  • RichFaces 应用程序,我应该使用 rich:dataTable 还是 jQGrid,优缺点吗?

    继从here https stackoverflow com questions 3899649 ok to wrap jsf components generated html with own divs using jquery aft
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • ggplot2 的 fortify 函数出错

    我在 ggplot2 中使用 fortify 方法时收到此错误 Error in function classes fdef mtable unable to find an inherited method for function pr
  • 在门户中查看 Azure WebJob 计划?

    我创建了一个简单的 Azure WebJob 并通过 Visual Studio 集成制定了每天运行一次的计划 我已经部署了 WebJob 并看到它列在我在 Azure 上的应用程序中 schema http schemastore org
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima
  • 以 Rails 形式处理 MongoMapper EmbeddedDocument

    首先 我对一般编程和 Rails 都是新手 我选择 Rails 是因为它看起来是一种很容易上手的语言 对于我的项目 我将 MongoMapper 与 Rails 结合使用 我正在尝试以与文档相同的形式处理嵌入文档 我有以下模型 class
  • 根据列中的部分字符串匹配选择数据框行

    我想根据列中字符串的部分匹配从数据框中选择行 例如列 x 包含字符串 hsa 使用sqldf if它有一个like语法 我会做类似的事情 select from lt gt where x like hsa 很遗憾 sqldf不支持该语法
  • 小于或等于

    使用暂停命令我发现错误位于此代码的第一行 if choice 1 if energy gt m2enc set a enemhp enemhp m1hpd earmr pause set a energy energy m1enc set
  • 从 npm 脚本运行时,eslint 不会报告任何错误

    我已经使用 npm init eslint config 安装了带有 typescript 的 eslint 然后将 lint 脚本添加到我的 package json 中 但是当我运行 npm script lint npm run li
  • 无法将 /root/.rnd 加载到 RNG 中

    我想使用 Windows Open SSL 生成服务器证书 当我运行此命令行时 出现此错误 我应该怎么办 Command openssl req new x509 days 3650 key ca key out ca crt Error
  • jQuery:动态添加 DOM 元素时尝试将函数挂钩到 onclick,但它立即执行该函数

    我正在使用 jQuery 动态 我的意思是在运行时 向页面的 DOM 添加一个 span 元素 create add task button document createElement span attr id activityNameH
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐