ASP.NET MVC 4 互联网模板中添加一些新的、 非常有用的功能,构建 SimpleMembership。这些更改将添加一些很有特色,像很多更简单、 可扩展会员 API 和 OAuth 的支持。但是,新的帐户管理功能需要 SimpleMembership 和对现有 ASP.NET 成员资格提供程序不起作用。我将开始与顶尖的东西你需要知道,摘要,然后挖到更多细节。
摘要:
以下是与埃里克 · 波特 (下午为 ASP.NET MVC) 的几次谈话的结果,以确保我有过一些整体的详细信息直,结合了很多时间在浏览工具的 ILSpy 和 Visual Studio 组件周围挖土。
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 框架。所以我们叫它什么我们已创建了此新痾?很好,没有别的SimpleMembership。SimpleMembership是一个总称为SimpleMembership和SimpleRoles.
简化会员资格的一部分涉及修复一些常见的 ASP.NET 成员资格问题。
ASP.NET 成员资格很明显是围绕一组假设的设计:
从这些假设掉下来的几个问题。
默认情况下和全功能提供商大多数 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 !坚持一下,我们会给那些……
如果你想要与另一个数据库或其他成员资格存储系统协同工作,您需要向从提供程序的基类继承和重写方法,集中存储在关系数据库中的 MembershipUser 的一群。它可以做 (和您经常可以发现已经写的很好的),但它是大量的工作,往往将给你留下丑陋的代码,已请有趣的一群,因为有很多只是不适用的方法。
现有的提供商的重点是传统会员-用户既有一个用户名和密码),一些特定的角色,例如管理员高级用户),在网站上,可能有一些其他的"好了"可选信息,可以通过在您的应用程序中的 API 访问。
这并不很符合一些现代用法模式:
什么在这里会更好地工作很多是您得以定义您的用户、 权限和系统属性,但是你想要和成员资格系统工作与您的模型-不是。
我已经提到过这几次,但是它承担分别调用-ASP.NET 成员资格的重点是 SQL Server 存储和存储基于非常特定的数据库架构。
更新: 此架构已经进步了很多与普遍的提供商。删除视图和存储的过程和表的简化。
不过,主要的问题是不变: 你不在的架构中,控制和任何配置文件数据存储在配置文件表中的属性值 blob 中:
你可能已经猜到了,SimpleMembership 被为了解决上述问题。
马修 Osborn 解释说在他的 SimpleMembership 使用与 ASP.NET 网页的文章,SimpleMembership 旨在将与您的数据库架构集成:
所有SimpleMembership都需要的只是有两个列在您的用户表上以便我们可以挂接到它 — —"ID"列和"用户名"列。这里重要的是他们可以命名任何你想要。例如用户名不一定要它可能是你只需要告诉SimpleMembership将其看作"用户名",用来登录电子邮件列的别名。
马修的示例演示使用同一个用户 Id 和用户名的列,然后一群他想要在其应用程序中其他列的命名的用户 (它可能被命名为任何东西) 非常简单的用户表。
然后我们点 SimpleMemberhip 在表中具有一行程序:
1
WebSecurity.InitializeDatabaseFile(``"SecurityDemo.sdf"``,
,
的"Users"
"UserID"``,
"Username"``,
true``);
需要没有其它的表,该表可以命名任何我们想要,可以有很多我们想要的只要我们有东西我们可以映射到一个用户名和 ID 的任何架构。
虽然 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 类。在这里我生日属性添加到用户配置文件的类。
[Table("UserProfile")]
publicclassUserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
publicintUserId { get; set; }
publicstringUserName { get; set; }
publicDateTime Birthday { get; set; }
}
现在我想要访问的信息,如果我可以只是抓住该帐户的用户名和读取的值。
var context = newUsersContext();
var username = User.Identity.Name;
var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
var birthday = user.Birthday;
bership,一切都被键控关闭用户表的行中定义而不是一群没有您的控件的成员表中的项。
好吧,足够销售沥青 (和希望背景) 上为什么事情发生了变化。这将如何影响你?让我们开始与要显示的关系图 (注: 我已经通过删除几个类来显示重要关系简化):
所以 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 提供了六个项目模板:
从这些模板中,只有一个 (互联网模板) 使用 SimpleMembership。
基本模板已配置的与普遍提供商使用 ASP.NET 成员资格。您可以看到该 ASP.NET MVC 4 基本模板 web.config 中的配置:
这意味着它是业务像往常一样的基本模板所知 ASP.NET 成员资格的工作。
互联网模板都有几件事将设置为引导 SimpleMembership:
WebSecurity 可以使用任何 ExtendedMembershipProvider 工作。那里是一个在框中 (SimpleMembershipProvider),但您可以编写您自己。因为标准的 MembershipProvider 不是 ExtendedMembershipProvider,WebSecurity 将引发异常,如果默认成员资格提供程序是 MembershipProvider,而不是 ExtendedMembershipProvider。
实际的例子:
你会在 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。你可以做几件事:
这些都不是特别优雅或简单。也许我们 (或者只是我?) 可以做些为了使这更简单-也许 NuGet 包。然而,这应该是一个边缘案例-希望你会需要创建新的 ASP.NET,但使用旧式 ASP.NET 成员资格提供程序的案件应该很少见。请让我 (或,最好是团队) 知道是否这是不正确的假设。
4.5 ASP.NET Web 窗体采取了不同的方法,生成了 ASP.NET 成员资格。而不是使用 WebMatrix 安全程序集,Web 窗体使用 Microsoft.AspNet.Membership.OpenAuth 程序集。我不是专家在这方面,但从 ILSpy 和 Visual Studio (非常漂亮) 依赖关系图中的时间点,这使用成员资格的适配器保存 OAuth 入 EF 数据托管数据库仍在运行在 ASP.NET 成员资格的同时。
注: 可能有办法使用这在 ASP.NET MVC 4 中,虽然它可能会把它挂一些水暖工作。
只是想总结一下:
Visual Studio 包含模具启动网站管理工具(WSAT) 在您的应用程序中配置用户和角色。
WSAT 工作与 ASP.NET 成员资格,而生成并不是兼容的简单的成员。有两个主要选项有:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章