实现自定义 MySQL ASP.NET Identity 存储提供程序

作者: Raquel Soares De AlmeidaSuhas JoshiTom FitzMacken

ASP.NET Identity 是一个可扩展的系统,可用于创建自己的存储提供程序并将其插入应用程序,而无需重新运行应用程序。 本主题介绍如何为 ASP.NET 标识创建 MySQL 存储提供程序。 有关创建自定义存储提供程序的概述,请参阅 用于 ASP.NET 标识的自定义存储提供程序概述

若要完成本教程,必须具有 Update 2 的Visual Studio 2013。

本教程将:

  • 演示如何在 Azure 上创建 MySQL 数据库实例。
  • 演示如何使用 MySQL 客户端工具 (MySQL Workbench) 在 Azure 上创建表和管理远程数据库。
  • 演示如何将默认 ASP.NET 标识存储实现替换为 MVC 应用程序项目的自定义实现。

本教程最初由 Raquel Soares De Almeida 和 Rick Anderson ( @RickAndMSFT ) 编写。 示例项目已由 Suhas Joshi 更新为 Identity 2.0。 主题已由 Tom FitzMacken 更新了 Identity 2.0。

下载已完成的项目

在本教程结束时,你将有一个 MVC 应用程序项目,其中包含 ASP.NET 标识,它使用 Azure 上托管的 MySQL 数据库。

可以在 AspNet.Identity.MySQL (GitHub) 下载已完成的 MySQL 存储提供程序。

你将执行的步骤

在本教程中,将:

  1. 在 Azure 上创建 MySQL 数据库
  2. 在 MySQL 中创建 ASP.NET 标识表
  3. 创建 MVC 应用程序并将其配置为使用 MySQL 提供程序
  4. 运行应用

本主题不介绍 ASP.NET 标识的体系结构,以及实现客户存储提供程序时必须做出的决策。 有关该信息,请参阅 ASP.NET 标识的自定义存储提供程序概述

查看 MySQL 存储提供程序类

在跳转到创建 MySQL 存储提供程序的步骤之前,让我们看一下构成存储提供程序的类。 你需要用于管理数据库操作的类和从应用程序调用的类来管理用户和角色。

存储类

  • IdentityUser - 包含用户的属性。
  • UserStore - 包含用于添加、更新或检索用户的操作。
  • IdentityRole - 包含角色的属性。
  • RoleStore - 包含用于添加、删除、更新和检索角色的操作。

数据访问层类

对于此示例,数据访问层类包含用于处理表的 SQL 语句;但是,在代码中,可能需要使用对象关系映射 (ORM) ,例如 Entity Framework 或 NHibernate。 具体而言,如果没有包含延迟加载和对象缓存的 ORM,应用程序可能会遇到性能不佳的情况。

  • MySQLDatabase - 包含用于执行数据库操作的 MySQL 数据库连接和方法。 UserStore 和 RoleStore 都使用此类的实例进行实例化。
  • RoleTable - 包含存储角色的表的数据库操作。
  • UserClaimsTable - 包含存储用户声明的表的数据库操作。
  • UserLoginsTable - 包含存储用户登录信息的表的数据库操作。
  • UserRoleTable - 包含存储哪些用户分配到哪些角色的表的数据库操作。
  • UserTable - 包含存储用户的表的数据库操作。

在 Azure 上创建 MySQL 数据库实例

  1. 登录到 Azure 门户
  2. 单击页面底部的“ +新建 ”,然后选择“ STORE”。
    显示如何访问 Azure 门户存储的图像
  3. “选择和加载项 ”向导中,选择“ ClearDB MySQL 数据库 ”,然后单击对话框右下角的“下一步”箭头。
    显示 Clear D B My S Q L Database 广告的图像
  4. 保留默认 的“免费 ”计划,并将 “名称” 更改为 “IdentityMySQLDatabase”。 选择离你最近的区域,然后单击“下一步”箭头。
    所选免费计划的图像和名称
  5. 单击复选标记以完成数据库创建。
    评审购买和数据库创建的图像
  6. 在创建数据库后,可以从管理门户中的“外接程序”选项卡管理该数据库。
    加载项选项卡的图像
  7. 可以通过单击页面底部的“ 连接信息 ”获取数据库连接信息。
    显示连接信息位置的图像
  8. 单击复制按钮复制连接字符串并保存,以便稍后可以在 MVC 应用程序中使用。
    显示连接字符串和 U R L 的图像

在 MySQL 数据库中创建 ASP.NET 标识表

安装 MySQL Workbench 工具以连接和管理 MySQL 数据库

  1. 从 MySQL 下载页安装 MySQLWorkbench 工具
  2. 启动应用并添加,单击 MySQLConnections + 按钮添加新连接。 使用之前在本教程中创建的 Azure MySQL 数据库中复制的连接字符串数据。
  3. 建立连接后,打开新的 “查询 ”选项卡;将 MySQLIdentity.sql 中的命令粘贴到查询中,并执行该命令以创建数据库表。
  4. 现在,在 Azure 上托管的 MySQL 数据库上创建了所有 ASP.NET 标识必需的表,如下所示。
    显示标识必要表的图像

从模板创建 MVC 应用程序项目,并将其配置为使用 MySQL 提供程序

如果需要,请安装 Visual Studio Express 2013 for WebVisual Studio 2013 Update 2。

下载 ASP.NET。GitHub 中的 Identity.MySQL 项目

  1. 浏览到 AspNet.Identity.MySQL (GitHub) 的存储库 URL。
  2. 下载源代码。
  3. 将.zip文件解压缩到本地文件夹中。
  4. 打开 AspNet.Identity.MySQL 解决方案并生成它。

从模板创建新的 MVC 应用程序项目

  1. 右键单击 AspNet.Identity.MySQL 解决方案和“添加”、“新建项目

  2. 在“添加新项目”对话框中,选择左侧的“Visual C#”,然后选择“Web”,然后选择“ASP.NET Web 应用程序”。 将项目命名 为 IdentityMySQLDemo;然后单击“确定”。

    “添加新项目”对话框窗口的图像

  3. 在“ 新建 ASP.NET 项目 ”对话框中,选择包含默认选项的 MVC 模板, (将 个人用户帐户 作为身份验证方法) 并单击“ 确定”。新的 A S P 点 N E 项目对话框窗口的图像

  4. 在“解决方案资源管理器”中,右键单击“IdentityMySQLDemo”项目,然后选择“管理 NuGet 包”。 在搜索文本框对话框中,键入 Identity.EntityFramework。 在结果列表中选择此包,然后单击“ 卸载”。 系统将提示卸载依赖项包 EntityFramework。 单击“是”,因为我们将不再在此应用程序上此包。

  5. 右键单击“IdentityMySQLDemo”项目,选择“ 添加”、“ 引用”、“解决方案”、“项目”; 选择“AspNet.Identity.MySQL”项目并单击“ 确定”。

  6. 在 IdentityMySQLDemo 项目中,替换对 的所有引用
    using Microsoft.AspNet.Identity.EntityFramework;
    替换为
    using AspNet.Identity.MySQL;

  7. 在 IdentityModels.cs 中,将 ApplicationDbContext 设置为派生自 MySqlDatabase ,并包含一个构造函数,该构造函数采用具有连接名称的单个参数。

    public class ApplicationDbContext : MySQLDatabase
    {
        public ApplicationDbContext(string connectionName)
            : base(connectionName)
        {
        }
    
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext("DefaultConnection");
        }
    }
    
  8. 打开 IdentityConfig.cs 文件。 在 ApplicationUserManager.Create 方法中,将实例化 UserManager 替换为以下代码:

    var manager = new ApplicationUserManager(
        new UserStore<ApplicationUser>(
        context.Get<ApplicationDbContext>() as MySQLDatabase));
    
  9. 打开 web.config 文件,将 DefaultConnection 字符串替换为此项,将突出显示的值替换为在前面步骤中创建的 MySQL 数据库的连接字符串:

    <add name="DefaultConnection" connectionString="Database=IdentityMySQLDatabase;
    Data Source=<DataSource>;User Id=<UserID>;Password=<Password>"
    providerName="MySql.Data.MySqlClient" />
    

运行应用并连接到 MySQL DB

  1. 右键单击 IdentityMySQLDemo 项目,然后选择“设置为启动项目

  2. Ctrl + F5 生成并运行应用。

  3. 单击页面顶部的“ 注册 ”选项卡。

  4. 输入新的用户名和密码,然后单击“ 注册”。

    显示新用户名和密码的图像

  5. 新用户现已注册并登录。

    显示新用户已注册并登录的插图

  6. 返回 MySQL Workbench 工具并检查 IdentityMySQLDatabase 表的内容。 在注册新用户时检查用户表中的条目。

    My S Q L Workbench 检查工具的图像

后续步骤

有关如何在此应用上启用其他身份验证方法的详细信息,请参阅 使用 Facebook 和 Google OAuth2 和 OpenID 登录创建 ASP.NET MVC 5 应用

若要了解如何将 DB 与 OAuth 集成并设置角色以限制用户对应用的访问权限,请参阅将具有成员资格、OAuth 和 SQL 数据库的安全 ASP.NET MVC 5 应用部署到 Azure