다음을 통해 공유

教程:使用托管标识将 Azure Web 应用连接到没有机密的 Azure SQL 数据库

Azure 应用服务在 Azure 中提供高度可缩放、自修补的 Web 托管服务。 应用服务还提供应用的 托管标识 ,这是保护对 Azure SQL 和其他 Azure 服务的访问的统包解决方案。 应用服务中的托管标识通过消除机密(例如连接字符串中的凭据)使应用更安全。

本教程介绍如何将托管标识添加到具有 Azure SQL 后端的示例 .NET 应用。 完成后,应用可以安全地连接到 Azure SQL 数据库,而无需用户名和密码。

教程方案的体系结构示意图。

在本教程中,你将:

  • 启用托管身份。
  • 授予 Azure SQL 数据库对托管标识的访问权限。
  • 将 Entity Framework 配置为对 SQL 数据库使用 Microsoft Entra 身份验证。
  • 使用 Microsoft Entra 身份验证从 Visual Studio 连接到 SQL 数据库。

有关在 Node.js、Python 和 Java 框架中使用 Azure Database for MySQL 或 Azure Database for PostgreSQL 的指南,请参阅 教程:使用托管标识从应用服务连接到 Azure 数据库,无需使用密码

注意

  • 本地 SQL Server 不支持 Microsoft Entra ID 和托管标识。

  • Microsoft Entra 身份验证不同于本地 Active Directory(AD) 域服务(DS)中的 集成 Windows 身份验证 。 AD DS 和 Microsoft Entra ID 使用的身份验证协议完全不相同。 有关详细信息,请参阅 Microsoft Entra 域服务文档

先决条件

  • 如果您还没有 Azure 试用订阅,请在开始之前创建一个试用订阅。

  • 拥有基本的 Azure 应用服务 ASP.NET MVCASP.NET Core MVC create-read-update-delete (CRUD) 应用,该应用使用 Azure SQL 数据库作为后端的 SQL 身份验证。 本教程中的步骤支持以下 .NET 版本:

    • .NET Framework 4.8 及更高版本
    • .NET 6.0 及更高版本
  • 允许从计算机到 Azure 的客户端连接,以便在开发环境中调试应用。 可以使用 Azure 门户按照管理服务器级 IP 防火墙规则中的步骤添加客户端 IP 地址。

授予数据库管理员对 Microsoft Entra 用户的访问权限

通过将 Microsoft Entra 用户分配为 Azure SQL 服务器的管理员,启用对 Azure SQL 数据库的Microsoft Entra 身份验证。 Microsoft Entra 管理员必须是创建、导入、同步或邀请到 Microsoft Entra ID 的用户。 此用户可能与 Azure 订阅的 Microsoft 帐户用户不同。

在 Azure CLI 的 Bash 环境中运行以下命令。

  1. 使用az ad user listdisplay-namefilterupn参数结合,以获取要设为管理员的 Microsoft Entra ID 用户的对象 ID。独立运行az ad user list,以显示 Microsoft Entra 目录中所有用户的信息。

    例如,以下命令列出 Microsoft Entra ID 用户 Firstname Lastname 的display-name信息。

    az ad user list --display-name "Firstname Lastname"
    

    下面是示例输出:

     "businessPhones": [],
     "displayName": "Firstname Lastname",
     "givenName": null,
     "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
     "jobTitle": null,
     "mail": "firstname@contoso.com",
     "mobilePhone": null,
     "officeLocation": null,
     "preferredLanguage": null,
     "surname": null,
     "userPrincipalName": "firstname@contoso.com"
    
  2. 使用az sql server ad-admin createobject-id参数将 Microsoft Entra ID 用户添加为 Azure SQL Server 上的管理员。 在以下命令中,用去掉 .database.chinacloudapi.cn 后缀的服务器名称替换 <server-name>,并将 <entra-id> 替换为上述 az ad user list 命令输出中的 id 值。

    az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id <entra-id>
    

为应用设置托管身份连接

以下步骤将应用配置为使用系统分配的托管标识连接到 Azure SQL 数据库。 若要使用用户分配的标识,请参阅 教程:使用托管标识从应用服务连接到 Azure 数据库,而无需使用秘密

为应用启用托管标识

若要为 Azure 应用启用托管标识,请使用 az webapp identity assign 命令,将其 <app-name> 替换为应用名称。 系统分配的标识的名称始终与应用名称相同。

az webapp identity assign --resource-group myResourceGroup --name <app-name>

这是一个输出示例:

{
  "additionalProperties": {},
  "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
  "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "type": "SystemAssigned"
}

若要为 部署槽启用托管标识,请在上述命令中添加 --slot <slot-name>,并在 <slot-name> 中使用槽名称。 部署插槽的系统分配标识的名称为 <app-name>/slots/<slot-name>

还可以将标识添加到 Microsoft Entra 组,然后将 SQL 数据库访问权限授予 Microsoft Entra 组,而不是直接授予该标识权限。 若要授予Microsoft Entra 组的权限,请使用组的显示名称。 以下命令将示例托管标识添加到名为 myAzureSQLDBAccessGroup 的新组。

$groupid=(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
$msiobjectid=(az webapp identity show --resource-group myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid

向托管身份授予权限

向标识授予应用程序所需的最低权限。

  1. 打开 PowerShell 命令行并使用以下 SQLCMD 命令登录到 SQL 数据库。 将<server-name>替换为您的服务器名称,<db-name>替换为您的数据库名称,<admin-user>userPrincipalName替换为上述az ad user list命令输出中的管理员用户相关信息。

    sqlcmd -S <servername>.database.chinacloudapi.cn -d <db-name> -U <admin-user> -G -l 30
    

    按提示登录。

  2. 在 SQL 提示符下运行以下命令,向应用授予对数据库所需的最低权限。 将 <identity-name> 替换为 Microsoft Entra ID 中托管标识的名称,该名称与应用名称相同。

    CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
    GO
    

注意

后端托管标识服务 维护令牌缓存 ,该缓存仅在目标资源过期时更新该令牌。 如果在首次获取应用令牌后尝试修改 SQL 数据库权限,则在缓存令牌过期之前,不会获得具有更新权限的新令牌。

删除原始连接字符串

在web.configappsettings.json 所做的任何更改都适用于托管标识。 可以删除首次部署应用时使用的原始连接字符串。 若要删除连接字符串,请运行以下 Azure CLI 命令,将其替换为 <app-name> 应用的名称和 <connection-string-name> 连接字符串的名称。

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names <connection-string-name>

设置开发环境

设置所选的开发环境并登录到 Azure。 有关为 Microsoft Entra 身份验证设置开发环境的详细信息,请参阅适用于 .NET 的 Azure 标识客户端库

Visual Studio for Windows 集成了 Microsoft Entra 身份验证。

  1. 若要在 Visual Studio 中启用开发和调试,请从顶部菜单中选择“ 文件>帐户设置” ,然后选择“ 登录 ”或“ 添加”,在 Visual Studio 中添加Microsoft Entra 用户。
  2. 若要为 Azure 服务身份验证设置Microsoft Entra 用户,请从顶部菜单中选择 “工具>选项 ”,然后选择 “Azure 服务身份验证>帐户选择”。 选择已添加的 Microsoft Entra 用户,然后选择“确定”

修改项目并发布应用

Azure SQL 数据库支持的 Web 应用使用数据库上下文来连接数据库。 若要使用 Microsoft Entra 身份验证来处理应用,必须更新数据库上下文以引用 Entity Framework SQL Server 提供程序,这依赖于新式 Microsoft.Data.SqlClient ADO.NET 提供程序。

Entity Framework 提供程序取代了内置的 System.Data.SqlClient SQL Server 提供程序,并包括对 Microsoft Entra ID 身份验证方法的支持。 有关详细信息,请参阅 Microsoft.EntityFramework.SqlServer

[DbConfigurationType(typeof(MicrosoftSqlDbConfiguration))] 在本地用于 Microsoft.Data.SqlClient 数据库上下文,但由于 System.Data.SqlClient 被硬编码为 Azure 应用服务的提供程序,因此必须扩展 MicrosoftSqlDbConfigurationSystem.Data.SqlClient 的引用重定向到 Microsoft.Data.SqlClient。 步骤因有 ASP.NET 还是 ASP.NET Core 应用而异。

默认情况下,ASP.NET Core 应用使用 Entity Framework Core。

  1. 在 Visual Studio 包管理器控制台中,添加 NuGet 包 Microsoft.Data.SqlClient

    Install-Package Microsoft.Data.SqlClient
    
  2. appsettings.json中,将连接字符串的值替换为以下代码,并用您的服务器名称替换 <server-name,用数据库名称替换 <database-name>

    "Server=tcp:<server-name>.database.chinacloudapi.cn;Authentication=Active Directory Default; Database=<database-name>;"
    

    注意

    可以在本地计算机和 Azure 应用服务中使用 Active Directory 默认 身份验证。 驱动程序可以通过多种不同的方式从 Microsoft Entra ID 获取令牌。

    如果部署了应用,驱动程序将从应用的系统分配的托管标识获取令牌。 当您在连接字符串中包含 User Id=<client-id-of-user-assigned-managed-identity>; 时,驱动程序还可以用用户分配的托管身份进行身份验证。

    DefaultAzureCredential 在内存中缓存令牌,并在过期前从 Microsoft Entra ID 中检索令牌。 不需要任何自定义代码就可以刷新该令牌。

    现在,在 Visual Studio 中调试时,你已经具备了连接 Azure SQL 数据库所需的一切。 代码使用在设置开发环境时配置的 Microsoft Entra 用户。

  3. 运行应用。 浏览器中的 CRUD 应用使用 Microsoft Entra 身份验证直接连接到 Azure SQL 数据库。 此设置使你能够从 Visual Studio 运行数据库迁移。

  4. 使用以下 Git 命令发布更改:

    git commit -am "configure managed identity"
    git push azure main
    

测试应用程序

当新网页显示待办事项列表时,表明应用使用了托管标识连接到数据库。

显示 Code First 迁移后的 Azure 应用的屏幕截图。

现在可以编辑 to-do 列表。

清理资源

在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在本地 Azure CLI 中运行以下命令删除资源组:

az group delete --name myResourceGroup

此命令可能需要花费一点时间运行。