SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板

ASP.NET MVC 4 互联网模板中添加一些新的、 非常有用的功能,构建 SimpleMembership。这些更改将添加一些很有特色,像很多更简单、 可扩展会员 API 和 OAuth 的支持。但是,新的帐户管理功能需要 SimpleMembership 和对现有 ASP.NET 成员资格提供程序不起作用。我将开始与顶尖的东西你需要知道,摘要,然后挖到更多细节。

摘要:

  • SimpleMembership 的设计作为替换为先前的 ASP.NET 角色和成员资格提供程序系统
  • SimpleMembership 解决了开发人员遇到与成员资格提供程序系统,为现代的用户设计的常见问题 / 会员 / 存储需求
  • SimpleMembership 集成了以前的会员制度,但不是能使用 MembershipProvider 与 SimpleMembership
  • 新的 ASP.NET MVC 4 互联网应用程序模板 AccountController 需要 SimpleMembership 并不是与以前的 MembershipProviders 兼容
  • 您可以继续使用现有的 ASP.NET 角色和成员资格提供程序在 ASP.NET 4.5 和 ASP.NET MVC 4-只是不与 ASP.NET MVC 4 AccountController
  • 现有 ASP.NET 角色和成员资格提供程序系统仍然是支持的因为它是 ASP.NET 核心的一部分
  • 4.5 ASP.NET Web 窗体不会使用 SimpleMembership ;它实现了在 ASP.NET 成员资格的 OAuth
  • ASP.NET 网站管理工具 (WSAT) 不是与 SimpleMembership 兼容

以下是与埃里克 · 波特 (下午为 ASP.NET MVC) 的几次谈话的结果,以确保我有过一些整体的详细信息直,结合了很多时间在浏览工具的 ILSpy 和 Visual Studio 组件周围挖土。

SimpleMembership: 未来的 ASP.NET 成员资格

ASP.NET 成员资格系统介绍了以 ASP.NET 2.0 在 2005 年。它为了解决常见的网站成员要求在时,一般涉及的用户名 / 密码根据注册和配置文件存储在 SQL Server 中的。它被设计几个扩展性机制-尤其是一个提供程序系统 (这允许您重写一些细节像备份存储) 和存储附加的配置文件信息 (虽然附加的配置文件信息被打包到单个列,通常需要通过 API 访问) 的能力。虽然有时令人沮丧,与工作,但它举行了七年-可能因为它处理的主要用例 (用户名 / 密码基于 SQL Server 数据库中的成员身份) 顺利和可以适应大多数其他需要 (再次,往往令人沮丧,但它可以工作)。

ASP.NET Web 页面和 WebMatrix 努力使团队有机会看看很多东西-新如 Razor 语法入门 ASP.NET 网页中,不 ASP.NET MVC。ASP.NET 网页中团队设计的 SimpleMembership (等待它) 简化处理成员资格的任务。正如马太福音 》 奥斯本说在他发布的 SimpleMembership 使用与 ASP.NET 网页:

与 ASP.NET 网页和 WebMatrix 的介绍我们的团队拥有的堆栈真的重点使事情更简单,开发人员。基于大量的客户反馈,我们想要改善的领域之一是内置在 ASP.NET 中的安全。所以此版本我们花了时间来创建一个新的内置的 (和 ASP.NET 网页的默认值) 安全提供程序。我说提供商,因为新的东西仍然建立在现有的 ASP.NET 框架。所以我们叫它什么我们已创建了此新痾?很好,没有别的SimpleMembershipSimpleMembership是一个总称为SimpleMembershipSimpleRoles.

简化会员资格的一部分涉及修复一些常见的 ASP.NET 成员资格问题。

ASP.NET 成员资格的问题

ASP.NET 成员资格很明显是围绕一组假设的设计:

  • 用户和用户信息将最有可能存储在一个完整的 SQL Server 数据库中或在 Active Directory 中
  • 将围绕一系列共同属性的优化用户和配置文件信息 (用户名、 密码、 IsApproved、 CreationDate、 评论角色成员资格...) 和其他用户配置文件信息将通过配置文件提供程序访问

从这些假设掉下来的几个问题。

要求完整的 SQL Server 在默认情况下

默认情况下和全功能提供商大多数 ASP.NET 成员资格提供商 (SQL 成员资格提供程序,SQL 角色提供程序,SQL 配置文件提供程序),需要完整的 SQL 服务器。他们依赖于存储的过程的支持,和它们依赖于 SQL Server 缓存依赖项,他们清洁取决于代理和维修。所以基于 SQL Server 提供的主要好在 SQL Server CE 上不工作,不会工作框中 SQL Azure,等等。

注:柯福勒最近让我知道这些更新 ASP.net 脚本的使用与 Microsoft SQL Azure,做支持成员资格、 个性化设置、 配置文件、 和角色。但我们需要一套单独的 SQL 脚本的支持页面的事实突出了根本问题。

啊哈,你说 !Jon 的忘了通用的提供者,又叫 System.Web.Providers !坚持一下,我们会给那些......

自定义成员资格提供程序必须使用一个 SQL 服务器为中心的 API

如果你想要与另一个数据库或其他成员资格存储系统协同工作,您需要向从提供程序的基类继承和重写方法,集中存储在关系数据库中的 MembershipUser 的一群。它可以做 (和您经常可以发现已经写的很好的),但它是大量的工作,往往将给你留下丑陋的代码,已请有趣的一群,因为有很多只是不适用的方法。

围绕用户、 角色和配置文件的特定视图设计

现有的提供商的重点是传统会员-用户既有一个用户名和密码),一些特定的角色,例如管理员高级用户),在网站上,可能有一些其他的"好了"可选信息,可以通过在您的应用程序中的 API 访问。

这并不很符合一些现代用法模式:

  • 在 OAuth 和 OpenID,用户没有密码
  • 通常这些类型的情况下映射到用户索赔或权利而不是整体用户角色更好
  • 许多站点配置文件或其他非传统的信息是非常重要和需要从什么地方来的 API 调用映射到数据库 blob

什么在这里会更好地工作很多是您得以定义您的用户、 权限和系统属性,但是你想要和成员资格系统工作与您的模型-不是。

需要特定的架构,blob 列中的溢出

我已经提到过这几次,但是它承担分别调用-ASP.NET 成员资格的重点是 SQL Server 存储和存储基于非常特定的数据库架构。

更新: 此架构已经进步了很多与普遍的提供商。删除视图和存储的过程和表的简化。

不过,主要的问题是不变: 你不在的架构中,控制和任何配置文件数据存储在配置文件表中的属性值 blob 中:

作为一个更好的成员资格系统 SimpleMembership

你可能已经猜到了,SimpleMembership 被为了解决上述问题。

您的架构与工程

马修 Osborn 解释说在他的 SimpleMembership 使用与 ASP.NET 网页的文章,SimpleMembership 旨在将与您的数据库架构集成:

所有SimpleMembership都需要的只是有两个列在您的用户表上以便我们可以挂接到它 — —"ID"列和"用户名"列。这里重要的是他们可以命名任何你想要。例如用户名不一定要它可能是你只需要告诉SimpleMembership将其看作"用户名",用来登录电子邮件列的别名。

马修的示例演示使用同一个用户 Id 和用户名的列,然后一群他想要在其应用程序中其他列的命名的用户 (它可能被命名为任何东西) 非常简单的用户表。

然后我们点 SimpleMemberhip 在表中具有一行程序:

1
WebSecurity.InitializeDatabaseFile("SecurityDemo.sdf", , "Users" "UserID", "Username", true );

需要没有其它的表,该表可以命名任何我们想要,可以有很多我们想要的只要我们有东西我们可以映射到一个用户名和 ID 的任何架构。

扩大到整个 SQL Server 家族数据库支持

虽然 SimpleMembership不是数据库不可知,它整个 SQL Server 系列工作。它继续支持完整的 SQL Server,但它也可以配合 SQL Azure、 SQL Server CE、 SQL Server Express,和 LocalDB.一切都作为 SQL 调用来实现而不需要存储的过程、 视图、 代理和更改通知。

请注意 SimpleMembership 仍然需要一些风味的 SQL Server-它不会工作与 MySQL,NoSQL 数据库等。你可以看看 WebMatrix.WebData.dll 使用的工具,如 ILSpy,如果你想要看看为什么-有很中的代码在 SQL 服务器特定的 SQL 语句正在执行,尤其是创建和初始化表时的地方。好像你可能能够工作与另一个数据库,如果创建表分开,但我没试过,此时不支持它。

注: 我想它将有可能为 SimpleMembership (或兼容的东西) 要运行实体框架,所以它会与 EF 支持的任何数据库。这似乎对我的想法很有用吗?

注: SimpleMembership 有同样的数据库支持-SQL Server 家族中的任何东西-普遍提供商带给 ASP.NET 成员资格系统。

更新更新更新的普遍提供商-我相信从 1.2 发行版 8/16 开始-是现在真的数据库不可知论者,所以他们会工作有实体框架提供程序的任何数据库。

轻松地与实体框架代码优先

与 ASP.NET 成员资格系统中用于存储其他帐户信息的问题是它是门守护者。这就意味着你被困其架构和通过它的 API 访问的配置文件信息。

SimpleMembership 翻转周围一圈通过允许您使用任何表作为一个用户存储区。这意味着你在控制中的用户配置文件信息,并且您可以访问它,但是你会喜欢-它是只是数据。让我们看看一种实用的基于 ASP.NET MVC 4 互联网项目中的 AccountModel.cs 类。在这里我生日属性添加到用户配置文件的类。

1
2
3
4
5
6
7
8
9
[Table("UserProfile" )]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set ; }
    public string UserName { get; set ; }
    public DateTime Birthday { get; set ; }
}

现在我想要访问的信息,如果我可以只是抓住该帐户的用户名和读取的值。

1
2
3
4
var context = new UsersContext();
var username = User.Identity.Name;
var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
var birthday = user.Birthday;

所以不想 SimpleMembership 作为一个大会员 API,认为它作为处理基于您的用户数据库的成员身份的东西。在 SimpleMembership,一切都被键控关闭用户表的行中定义而不是一群没有您的控件的成员表中的项。

SimpleMembership 是如何集成与 ASP.NET 成员资格

好吧,足够销售沥青 (和希望背景) 上为什么事情发生了变化。这将如何影响你?让我们开始与要显示的关系图 (注: 我已经通过删除几个类来显示重要关系简化):

所以 SimpleMembershipProvider 是 ExtendedMembershipProvider,其中 MembershipProvider 从继承,并添加一些其他帐户的执行情况和 OAuth 相关的事情。这里是 ExtendedMembershipProvider 将添加到 MembershipProvider:

重要在这里带走的是 SimpleMembershipProvider 是 MembershipProvider,但 MembershipProvider 不是 SimpleMembershipProvider。

这种区分是重要的实践:需要 SimpleMembershipProvider,WebMatrix.WebData.WebSecurity 或 Microsoft.Web.WebPages.OAuth.OAuthWebSecurity 中包括任何调用的 API 不能使用 (包括在 System.Web.Providers 中找到的普遍提供商) 现有 MembershipProvider.

可是,只要它去。成员资格提供程序仍然工作如果您通过标准的成员资格 API,和所有核心的东西 — — 包括 AuthorizeAttribute,作用执法等-访问他们将工作只是罚款并没有任何改变。

让我们看看如何影响你的新模板。

在 ASP.NET MVC 4 项目模板中的成员资格

ASP.NET MVC 4 提供了六个项目模板:

  • -真的很空,只是程序集、 文件夹结构和一点点的基本配置。
  • 基本-像空,但有一点点的预配置的用户界面 (css / 图像 / 捆绑销售)。
  • 互联网-这有一家和帐户的控制器和关联的视图。帐户控制器支持注册和登录通过任一本地帐户和 OAuth / OpenID 提供商。
  • 内联网-像互联网的模板,但它被配置为 Windows 身份验证。
  • 移动-这预先配置为使用 jQuery 移动,它旨在为仅移动网站。
  • Web API -这预配置为基于 ASP.NET 的 Web API 服务后端。

从这些模板中,只有一个 (互联网模板) 使用 SimpleMembership。

ASP.NET MVC 4 基本模板

基本模板已配置的与普遍提供商使用 ASP.NET 成员资格。您可以看到该 ASP.NET MVC 4 基本模板 web.config 中的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
< profile defaultProvider = = "DefaultProfileProvider" >
  < providers >
    < add name = = "DefaultProfileProvider" type = = "System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName = = "DefaultConnection" applicationName = "/" />
  </ providers >
</ profile >
< membership defaultProvider = = "DefaultMembershipProvider" >
  < providers >
    < add name = = "DefaultMembershipProvider" type = = "System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName = = "DefaultConnection" enablePasswordRetrieval = = "false" enablePasswordReset = = "true" requiresQuestionAndAnswer = = "false" requiresUniqueEmail = = "false" maxInvalidPasswordAttempts = = "5" minRequiredPasswordLength = = "6" minRequiredNonalphanumericCharacters = = "0" passwordAttemptWindow = = "10" applicationName = "/" />
  </ providers >
</ membership >
< roleManager defaultProvider = = "DefaultRoleProvider" >
  < providers >
    < add name = = "DefaultRoleProvider" type = = "System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName = = "DefaultConnection" applicationName = "/" />
  </ providers >
</ roleManager >
< sessionState mode = = "InProc" customProvider = = "DefaultSessionProvider" >
  < providers >
    < add name = = "DefaultSessionProvider" type = = "System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName = = "DefaultConnection" />
  </ providers >
</ sessionState >

这意味着它是业务像往常一样的基本模板所知 ASP.NET 成员资格的工作。

ASP.NET MVC 4 互联网模板

互联网模板都有几件事将设置为引导 SimpleMembership:

  • \Models\AccountModels.cs定义了一个基本的用户帐户,包括数据批注要定义的键和这种
  • \Filters\InitializeSimpleMembershipAttribute.cs创建成员资格数据库使用,上面的模型,然后调用 WebSecurity.InitializeDatabaseConnection,验证基础表在放置和标记为已完成初始化 (用于应用程序的生存期)
  • \Controllers\AccountController.cs使大量使用的 OAuthWebSecurity (OAuth 帐户注册 / 登录 / 管理) 和 WebSecurity。WebSecurity提供的帐户管理服务,用于 ASP.NET MVC (和 Web 页)

WebSecurity 可以使用任何 ExtendedMembershipProvider 工作。那里是一个在框中 (SimpleMembershipProvider),但您可以编写您自己。因为标准的 MembershipProvider 不是 ExtendedMembershipProvider,WebSecurity 将引发异常,如果默认成员资格提供程序是 MembershipProvider,而不是 ExtendedMembershipProvider。

实际的例子:

  1. 创建新的 ASP.NET MVC 4 应用程序使用互联网应用程序模板
  2. 安装微软 ASP.NET 通用提供商 LocalDB NuGet 包
  3. 运行该应用程序、 登记册上单击,添加一个用户名和密码,并单击提交

你会在 AccountController.cs::Register 以下 execption:要调用此方法,"Membership.Provider"属性必须是实例的"ExtendedMembershipProvider"。

出现这种情况是因为 ASP.NET 通用提供商包包括一个 web.config 变换,将会更新您添加我上面的基本模板示例中显示的通用提供程序配置的 web.config。当 WebSecurity 尝试使用配置的 ASP.NET 成员资格提供程序时,它会检查是否它可以转换为 ExtendedMembershipProvider 才能做其他事。

所以,你该怎么办?

选项:

如果您想要使用新的 AccountController,您要么需要使用 SimpleMembershipProvider 或另一个有效的 ExtendedMembershipProvider。这是很简单的。

如果你想要在 ASP.NET MVC 4 中使用现有的 ASP.NET 成员资格提供程序,您不能使用新的 AccountController。你可以做几件事:

  1. 替换的 AccountController.cs 和 AccountModels.cs 在一个 ASP.NET MVC 4 互联网项目从 ASP.NET MVC 3 应用程序 (你当然不会有 OAuth 的支持)。然后,如果你想,你可以去并删除其他的事情,围绕 SimpleMembership-OAuth 分部视图,NuGet 包 (例如 DotNetOpenAuthAuth 包等)
  2. 使用 ASP.NET MVC 4互联网应用程序模板并添加一个普遍提供商 NuGet 包中。然后复制中的 AccountController 和 AccountModel 类。
  3. 创建一个 ASP.NET MVC 3 项目和升级到 ASP.NET MVC 4 使用 ASP.NET MVC 4 发行说明中所示的步骤.

这些都不是特别优雅或简单。也许我们 (或者只是我?) 可以做些为了使这更简单-也许 NuGet 包。然而,这应该是一个边缘案例-希望你会需要创建新的 ASP.NET,但使用旧式 ASP.NET 成员资格提供程序的案件应该很少见。请让我 (或,最好是团队) 知道是否这是不正确的假设。

ASP.NET 4.5 项目模板中的成员身份

4.5 ASP.NET Web 窗体采取了不同的方法,生成了 ASP.NET 成员资格。而不是使用 WebMatrix 安全程序集,Web 窗体使用 Microsoft.AspNet.Membership.OpenAuth 程序集。我不是专家在这方面,但从 ILSpy 和 Visual Studio (非常漂亮) 依赖关系图中的时间点,这使用成员资格的适配器保存 OAuth 入 EF 数据托管数据库仍在运行在 ASP.NET 成员资格的同时。

注: 可能有办法使用这在 ASP.NET MVC 4 中,虽然它可能会把它挂一些水暖工作。

这不会如何适应普遍提供商 (System.Web.Providers) 的?

只是想总结一下:

  • 普遍提供商的目的的情况下你有现有的 ASP.NET 成员资格提供程序,并且您想要使用另一个 SQL Server 数据库后端 (非 SQL Server)。它不需要代理商处理过期的会话清理和其他后台任务,它依附在其他调用这些任务。
  • 普遍提供商不是思维的真的,严格地说,普遍-至少我方式。他们只工作与 SQL Server 家族中的数据库。
  • 普遍提供商不能用简单的成员资格。
  • 普遍提供商包包括一些 web 配置转换,您通常希望当你使用它们。

网站管理工具呢?

Visual Studio 包含模具启动网站管理工具(WSAT) 在您的应用程序中配置用户和角色。

WSAT 工作与 ASP.NET 成员资格,而生成并不是兼容的简单的成员。有两个主要选项有:

  1. 使用 WebSecurity 和 OAuthWebSecurity API 来管理用户和角色
  2. 创建使用上述的 Api 是 web 管理员
  3. 因为在您的数据库上运行 SimpleMembership,您可以更新您的用户将任何其他数据-通过 EF 或甚至在 (中的课程的发展) 的直接数据库编辑

MVC4 成员资格、 身份验证的更多相关文章

  1. ASP.NET 成员资格 Part.2(使用安全控件 Login)

    原文:ASP.NET 成员资格 Part.2(使用安全控件 Login)        准备好提供程序以及用户信息的存储,就可以开始构建验证用户.注册用户或者让用户能够重置密码的用户界面了.ASP.N ...

  2. MVC4商城项目二:用户身份验证的实现

    用户身份验证,依赖于 forms 身份验证类:FormsAuthentication,它是一串加密的cookie 来实现对控制器访问限制和登陆页面的访问控制.它在浏览器端是这样子的: 需求:我们要实现 ...

  3. ASP.NET MVC 4 (十三) 基于表单的身份验证

    在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机 ...

  4. ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...

  5. ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介

    概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...

  6. membership与成员资格

    membership成员资格是ASP.NET 成员资格为您提供了一种验证和存储用户凭据的内置方法.因此,ASP.NET 成员资格可帮助您管理网站中的用户身份验证.它包含以下功能 创建新用户和密码. 将 ...

  7. SQL Server安全(2/11):身份验证(Authentication)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...

  8. 关于WEB Service&WCF&WebApi实现身份验证之WCF篇(1)

    WCF身份验证一般常见的方式有:自定义用户名及密码验证.X509证书验证.ASP.NET成员资格(membership)验证.SOAP Header验证.Windows集成验证.WCF身份验证服务(A ...

  9. ASP.NET MVC:窗体身份验证及角色权限管理示例

    ASP.NET MVC 建立 ASP.NET 基础之上,很多 ASP.NET 的特性(如窗体身份验证.成员资格)在 MVC 中可以直接使用.本文旨在提供可参考的代码,不会涉及这方面太多理论的知识. 本 ...

随机推荐

  1. Verilog之i2c合约

    说明:i2c乔布斯.有这么多的事情在网上参考. 时刻:2014年5一个月6周二星期 1.问题叙述性说明: 正如图.已知的时钟clk为100k,rst为复位信号.上升沿有效,基于Verilog HDL或 ...

  2. xml的加密和解密

    xml加密(XML Encryption)是w3c加密xml的标准.这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留. 介绍我们有3个 ...

  3. Python 类 --基础与要点

    1:2.x与3.x区别: 2.x:老式类,都继承自object,继承机制为深度优先 3.x:新式类不需要写(object),继承机制为广度优先 2:类说明: 在定义类下用""&qu ...

  4. 在div+css中用到的js代码注意return

    今天做了一个项目,美工做好后放在了form中(没有加runat=server),由于用到了服务器控件,所以这里要加,否则报错,关键一段div代码是: <form id="form_re ...

  5. notification:object not locked by thread before notify()

    今天写notification练习时,误将NotificationManager.notify(0, notification);写成notification.notify(); 代码如下 publi ...

  6. Redhat修改本地yum源

    1.将Centos系统的ios文件传到服务器,比如传到/root目录下: 2.将ios文件挂载到本地,需要在本地建立一个文件夹,比如/yum; mkdir /yum mount -o loop /ro ...

  7. jQuery选择器全解

    本篇介绍jQuery的选择器,jQuery选择器按照功能上分为"选择"和"过滤",并且是配合使用的.过滤的主要作用是从前面选定的选择器中选择的内容重进行筛选. ...

  8. partial修饰符,可以让同类命名空间下出现重名

    public partial class Person { } public partial class Person { } partial修饰符,可以让同类命名空间下出现重名,两个类其实是一个类, ...

  9. C#字符串的比较

    Console.WriteLine("输入字符1"); string n1 = Console.ReadLine(); Console.WriteLine("输入字符2& ...

  10. Enumeration

    Interface Enumeration<E> hasMoreElements() boolean hasMoreElements()    仅当此枚举对象包含至少一个以上元素为真:否则 ...