必须对Azure SQL Database的应用程序请求进行身份验证。 尽管有多个选项可用于对Azure SQL Database进行身份验证,但应尽可能确定应用程序中的无密码连接优先级。 使用密码或密钥的传统身份验证方法会产生安全风险和复杂性。 访问 Azure 服务的 无密码连接中心,详细了解迁移到无密码连接的优势。 以下教程介绍如何迁移现有应用程序以连接到Azure SQL Database以使用无密码连接,而不是用户名和密码解决方案。
配置Azure SQL Database
无密码连接使用Microsoft Entra身份验证连接到Azure服务,包括Azure SQL Database。 Microsoft Entra身份验证,可以在中心位置管理标识以简化权限管理。 详细了解如何为Azure SQL Database配置Microsoft Entra身份验证:
在此迁移指南中,请确保已在 Azure SQL 数据库中分配了一名 Microsoft Entra 管理员。
请导航到您的逻辑服务器上的Microsoft Entra页面。
选择 Set admin 打开 Microsoft Entra ID 浮出控件菜单。
在 Microsoft Entra ID 浮出控件菜单中,搜索要分配为管理员的用户。
选择该用户,然后选择“选择”。
一个显示如何启用 Microsoft Entra 管理员的屏幕截图。
配置本地开发环境
可以将无密码连接配置为同时适用于本地和Azure托管环境。 在本部分中,你将应用配置,以允许单个用户向Azure SQL Database进行身份验证,以便进行本地开发。
登录到Azure
对于本地开发,请确保使用要用于访问Azure SQL Database的同一Microsoft Entra帐户登录。 可以通过常用的开发工具(如Azure CLI或Azure PowerShell)进行身份验证。 可用于进行身份验证的开发工具因语言而异。
使用以下命令通过Azure CLI登录Azure。 这适用于 Windows、macOS 和 Linux。
az login
创建数据库用户并分配角色
在Azure SQL Database中创建用户。 用户应与用于通过Visual Studio或 IntelliJ 等开发工具本地登录的Azure帐户相对应。
在 Azure 门户中,浏览到 SQL 数据库并选择 Query 编辑器(预览版)。
选择屏幕右侧的“以
<your-username>身份继续”,使用你的帐户登录到数据库。在查询编辑器视图中,运行以下 T-SQL 命令:
CREATE USER [user@domain] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [user@domain]; ALTER ROLE db_datawriter ADD MEMBER [user@domain]; ALTER ROLE db_ddladmin ADD MEMBER [user@domain]; GO运行这些命令会将 SQL DB 参与者角色分配给指定的帐户。 此角色允许标识读取、写入和修改数据库的数据和架构。 有关分配的角色的详细信息,请参阅固定数据库角色。
更新本地连接配置
使用 Microsoft.Data.SqlClient 库或Entity Framework Core连接到Azure SQL Database的现有应用程序代码将继续使用无密码连接。 您必须更新数据库的连接字符串以使用无密码格式。 例如,以下代码使用 SQL 身份验证和无密码连接:
string connectionString = app.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING")!;
using var conn = new SqlConnection(connectionString);
conn.Open();
var command = new SqlCommand("SELECT * FROM Persons", conn);
using SqlDataReader reader = command.ExecuteReader();
为了更新引用的连接字符串(AZURE_SQL_CONNECTIONSTRING),请使用无密码连接字符串格式:
找到连接字符串。 对于使用 .NET 应用程序的本地开发,这通常存储在以下位置之一:
- 项目的
appsettings.json配置文件。 - Visual Studio项目的
launchsettings.json配置文件。 - 本地系统或容器环境变量。
- 项目的
将connection string值替换为以下无密码格式。 用你自己的值更新
<database-server-name>和<database-name>占位符:Server=tcp:<database-server-name>.database.chinacloudapi.cn,1433;Initial Catalog=<database-name>; Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication="Active Directory Default";
测试应用程序
在本地运行应用,并验证与Azure SQL Database的连接是否按预期工作。 请记住,更改Azure用户和角色可能需要几分钟才能通过Azure环境传播。 你的应用程序现已配置为在本地运行,开发人员无需管理该应用程序本身的机密。
配置Azure托管环境
将应用配置为在本地使用无密码连接后,相同的代码可以在部署到Azure后对Azure SQL Database进行身份验证。 以下各节介绍如何将已部署的应用程序配置为使用 托管标识连接到 Azure SQL Database。 托管标识在 Microsoft Entra ID(以前称为 Azure Active Directory)中提供自动托管身份,以便应用程序在连接到支持 Microsoft Entra 身份验证的资源时使用。 了解有关托管标识的更多信息:
创建托管标识
使用Azure门户或Azure CLI创建用户分配的托管标识。 应用程序将使用该标识向其他服务进行身份验证。
- 在 Azure 门户顶部,搜索 托管标识。 选择“托管标识”结果。
- 选择“托管标识”概述页顶部的“+ 创建”。
- 在“基本信息”选项卡中,输入以下值:
- “订阅”:选择所需的订阅。
- “资源组”:选择所需的资源组。
- 区域:选择你所在位置附近的区域。
- 名称:输入标识的可识别名称,例如 MigrationIdentity。
- 在页面底部选择查看 + 创建。
- 验证检查完成后,选择“创建”。 Azure创建新的用户分配标识。
创建资源后,选择“转到资源”以查看托管标识的详细信息。
将托管标识与 Web 应用相关联
配置 Web 应用以使用你创建的用户分配的托管标识。
在 Azure 门户中完成以下步骤,将用户分配的托管标识与应用相关联。 这些步骤适用于以下Azure服务:
- Azure Spring Apps
- Azure Container Apps
- Azure虚拟机
- Azure Kubernetes Service
- 导航到 Web 应用的概述页面。
为身份创建数据库用户并分配角色
创建一个映射回用户分配的托管标识的 SQL 数据库用户。 向用户分配所需的 SQL 角色,以允许应用读取、写入和修改数据库的数据和架构。
在 Azure 门户中,浏览到 SQL 数据库并选择 Query 编辑器(预览版)。
选择屏幕右侧的“以
<username>身份继续”,使用你的帐户登录到数据库。在查询编辑器视图中,运行以下 T-SQL 命令:
CREATE USER [user-assigned-identity-name] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [user-assigned-identity-name]; ALTER ROLE db_datawriter ADD MEMBER [user-assigned-identity-name]; ALTER ROLE db_ddladmin ADD MEMBER [user-assigned-identity-name]; GO运行这些命令会将 SQL DB 参与者角色分配给用户分配的托管标识。 此角色允许标识读取、写入和修改数据库的数据和架构。
重要
在企业生产环境中分配数据库用户角色时请谨慎。 在这些情况下,应用程序不应使用单个提升的权限执行所有操作。 通过为特定任务配置具有特定权限的多个标识,尝试实现最低特权原则。
若要详细了解如何配置数据库角色和安全性,可以阅读以下资源:
更新连接字符串
更新Azure应用配置以使用无密码连接字符串格式。 连接字符串通常作为环境变量存储在应用托管环境中。 以下说明侧重于应用服务,但其他Azure托管服务提供类似的配置。
导航到应用服务实例的配置页,找到Azure SQL Database connection string。
选择编辑图标并更新连接字符串值以符合以下格式。 将
<database-server-name>和<database-name>占位符替换为您服务的相应值。"Server=tcp:<database-server-name>.database.chinacloudapi.cn,1433;Initial Catalog=<database-name>; Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication="Active Directory Default";保存更改并重启应用程序(如果它未自动重启)。
测试应用程序
测试应用,确保一切仍然正常。 通过Azure环境传播所有更改可能需要几分钟时间。