你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用托管标识将 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 数据库。

有关在 Python、Java 和 Node.js框架中使用 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 域服务文档

先决条件

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

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

在 Azure Cloud Shell 的 Bash 环境中或在本地登录到 Azure CLI 后运行以下命令。

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

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

    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 上的管理员。 在以下命令中,将<server-name>替换为您的服务器名称(去除.database.windows.net后缀),并将<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>替换为来自上述az ad user list命令输出中的管理员用户userPrincipalName

    sqlcmd -S <servername>.database.windows.net -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.config 或 appsettings.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 应用服务中的提供程序,因此必须扩展 MicrosoftSqlDbConfiguration 以改为将 System.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.windows.net;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 资源。 如果认为将来不需要这些资源,请在 Cloud Shell 中运行以下命令删除资源组:

az group delete --name myResourceGroup

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