你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
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 域服务文档。
先决条件
-
如果没有 Azure 帐户,请在开始前创建一个免费帐户。
拥有基本的 Azure 应用服务 ASP.NET MVC 或 ASP.NET Core MVC create-read-update-delete (CRUD) 应用,该应用使用 Azure SQL 数据库作为后端的 SQL 身份验证。 本教程中的步骤支持以下 .NET 版本:
- .NET Framework 4.8 及更高版本
- .NET 6.0 及更高版本
允许从计算机到 Azure 的客户端连接,以便在开发环境中调试应用。 可以使用 Azure 门户按照管理服务器级 IP 防火墙规则中的步骤添加客户端 IP 地址。
登录到 Azure Cloud Shell 或准备环境以使用 Azure CLI。
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅开始使用 Azure Cloud Shell。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用和管理 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
授予数据库管理员对 Microsoft Entra 用户的访问权限
通过将 Microsoft Entra 用户分配为 Azure SQL 服务器的管理员,启用对 Azure SQL 数据库的Microsoft Entra 身份验证。 Microsoft Entra 管理员必须是创建、导入、同步或邀请到 Microsoft Entra ID 的用户。 此用户可能与 Azure 订阅的 Microsoft 帐户用户不同。
- 有关创建 Microsoft Entra 用户的详细信息,请参阅 使用 Microsoft Entra ID 添加或删除用户。
- 有关 SQL 数据库的允许Microsoft Entra 用户的详细信息,请参阅 SQL 数据库中Microsoft Entra 功能和限制。
- 有关添加 Azure SQL Server 管理员的详细信息,请参阅 为服务器预配Microsoft Entra 管理员。
在 Azure Cloud Shell 的 Bash 环境中或在本地登录到 Azure CLI 后运行以下命令。
使用
az ad user list
与display-name
、filter
或upn
参数结合,以获取您想要设置为管理员的 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"
使用
az sql server ad-admin create
object-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
向托管标识授予权限
向标识授予应用所需的最低权限。
打开 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
按提示登录。
在 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 身份验证。
- 若要在 Visual Studio 中启用开发和调试,请从顶部菜单中选择“ 文件>帐户设置” ,然后选择“ 登录 ”或“ 添加”,在 Visual Studio 中添加Microsoft Entra 用户。
- 若要为 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 。
在 Visual Studio 包管理器控制台中,添加 NuGet 包 Microsoft.Data.SqlClient。
Install-Package Microsoft.Data.SqlClient
在 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 用户。
运行应用。 浏览器中的 CRUD 应用使用 Microsoft Entra 身份验证直接连接到 Azure SQL 数据库。 此设置使你能够从 Visual Studio 运行数据库迁移。
使用以下 Git 命令发布更改:
git commit -am "configure managed identity" git push azure main
测试应用程序
当新网页显示待办事项列表时,表明应用使用了托管标识连接到数据库。
现在可以编辑 to-do 列表。
清理资源
在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在 Cloud Shell 中运行以下命令删除资源组:
az group delete --name myResourceGroup
此命令可能需要花费一点时间运行。