教程:使用 Windows VM 系统分配托管标识访问 Azure SQL

本教程介绍如何使用 Windows 虚拟机 (VM) 的系统分配标识访问 Azure SQL 数据库。 托管服务标识由 Azure 自动管理,可用于向支持 Microsoft Entra 身份验证的服务进行身份验证,这样就无需在代码中插入凭据了。 学习如何:

  • 授予 VM 对 Azure SQL 数据库的访问权限
  • 启用 Microsoft Entra 身份验证
  • 在数据库中创建一个代表 VM 的系统分配标识的包含用户
  • 使用 VM 标识获取访问令牌,并使用它查询 Azure SQL 数据库

先决条件

启用

启用系统分配的托管标识只需单击一次即可。 可以在创建 VM 的过程中或在现有 VM 的属性中启用它。

Screenshot shows the System assigned tab for a virtual machine where you can turn on the System assigned status.

若要在新 VM 上启用系统分配的托管标识,请执行以下操作:

  1. 登录到 Azure 门户

  2. 创建启用了系统分配标识的虚拟机

授予访问权限

若要授予 VM 对 Azure SQL 数据库中数据库的访问权限,可以使用现有逻辑 SQL Server,或创建新的 SQL Server。 若要使用 Azure 门户创建新的服务器和数据库,请遵循此 Azure SQL 快速入门Azure SQL 文档中还提供了有关使用 Azure CLI 和 Azure PowerShell 执行这些操作的快速入门。

授予 VM 对数据库的访问权限需要执行两个步骤:

  1. 为服务器启用 Microsoft Entra 身份验证。
  2. 在数据库中创建一个代表 VM 的系统分配标识的包含用户

启用 Microsoft Entra 身份验证

若要配置 Microsoft Entra 身份验证

  1. 在 Azure 门户的左侧导航栏中选择“SQL 服务器”。
  2. 选择要为 Microsoft Entra 身份验证启用的 SQL Server。
  3. 在边栏选项卡的“设置”部分中,单击“Active Directory 管理员”。
  4. 在命令栏中单击“设置管理员”。
  5. 选择要设为服务器管理员的 Microsoft Entra 用户帐户,单击“选择”。
  6. 在命令栏中,单击“保存”。

创建包含用户

本部分介绍如何在数据库中创建一个表示 VM 的系统分配标识的包含用户。 在此步骤中,需要使用 Microsoft SQL Server Management Studio (SSMS)。 在开始之前,查看以下文章了解有关 Microsoft Entra 集成的背景知识可能也有帮助:

SQL DB 需要唯一 Microsoft Entra ID 显示名称。 因此,Microsoft Entra 帐户(例如用户、组和服务主体(应用程序))以及启用了托管标识的 VM 名称必须在 Microsoft Entra ID 中针对其显示名称是唯一定义的。 SQL DB 在使用 T-SQL 创建此类用户期间会检查 Microsoft Entra ID 显示名称,如果它不唯一,则命令将无法请求为给定帐户提供唯一的 Microsoft Entra ID 显示名称。

若要创建包含用户,请执行以下操作:

  1. 启动 SQL Server Management Studio。

  2. 在“连接到服务器”对话框的“服务器名称”字段中,输入服务器名称 。

  3. 在“身份验证”字段中,选择“Active Directory - 通用且具有 MFA 支持”。

  4. 在“用户名”字段中,输入已设为服务器管理员的 Microsoft Entra 帐户的名称,例如 helen@woodgroveonline.com

  5. 单击“选项”。

  6. 在“连接到数据库”字段中,输入要配置的非系统数据库的名称。

  7. 单击“连接” 。 完成登录过程。

  8. 在“对象资源管理器”中,展开“数据库”文件夹。

  9. 右键单击用户数据库并选择“新建查询”。

  10. 在查询窗口中输入以下行,在工具栏中单击“执行”:

    注意

    以下命令中的 VMName 是在“先决条件”部分中对其启用系统分配标识的 VM 的名称。

    CREATE USER [VMName] FROM EXTERNAL PROVIDER
    

    该命令应该成功完成,为 VM 的系统分配标识创建包含的用户。

  11. 清除查询窗口中的内容,输入以下行,在工具栏中单击“执行”:

    注意

    以下命令中的 VMName 是在“先决条件”部分中对其启用系统分配标识的 VM 的名称。

    如果遇到错误“主体 VMName 具有重复的显示名称”,请在 CREATE USER 语句后追加 WITH OBJECT_ID='xxx'。

    ALTER ROLE db_datareader ADD MEMBER [VMName]
    

    命令应会成功完成,并授予包含的用户读取整个数据库的权限。

VM 中运行的代码现在可使用其系统分配托管标识获取令牌,并使用该令牌在服务器中进行身份验证。

访问数据

本部分介绍如何使用 VM 的系统分配托管标识获取访问令牌,并使用它调用 Azure SQL。 Azure SQL 原本就支持 Microsoft Entra 身份验证,因此可以直接接受使用 Azure 资源的托管标识获取的访问令牌。 此方法不需要在连接字符串上提供凭据。

下面是使用 Active Directory 托管标识身份验证打开 SQL 连接的 .NET 代码示例。 此代码必须在 VM 上运行才能访问 VM 系统分配的托管标识的终结点。 使用此方法需要 .NET Framework 4.6.2 或更高版本或者 .NET Core 3.1 或更高版本。 相应地替换 AZURE-SQL-SERVERNAME 和 DATABASE 的值,并添加对 Microsoft.Data.SqlClient 库的 NuGet 引用。

using Microsoft.Data.SqlClient;

try
{
//
// Open a connection to the server using Active Directory Managed Identity authentication.
//
string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>; Authentication=Active Directory Managed Identity; Encrypt=True";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();

注意

可以使用托管标识,同时使用 SDK 处理其他编程选项。

也可使用 PowerShell 快速测试端到端设置,而无需在 VM 上编写和部署应用。

  1. 在门户中,导航到“虚拟机”并转到 Windows 虚拟机,然后在“概述”中,单击“连接”。

  2. 输入在创建 Windows VM 时添加的 VM 管理员凭据。

  3. 现在,已经创建了与虚拟机的远程桌面连接,请在远程会话中打开 PowerShell。

  4. 使用 PowerShell 的 Invoke-WebRequest 向本地托管标识的终结点发出请求,以获取 Azure SQL 的访问令牌。

        $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatabase.chinacloudapi.cn%2F' -Method GET -Headers @{Metadata="true"}
    

    将响应从 JSON 对象转换为 PowerShell 对象。

    $content = $response.Content | ConvertFrom-Json
    

    从响应中提取访问令牌。

    $AccessToken = $content.access_token
    
  5. 与服务器建立连接。 请记得替换 AZURE-SQL-SERVERNAME 和 DATABASE 的值。

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Data Source = <AZURE-SQL-SERVERNAME>; Initial Catalog = <DATABASE>; Encrypt=True;"
    $SqlConnection.AccessToken = $AccessToken
    $SqlConnection.Open()
    

    接下来,创建一个查询并将其发送到服务器。 请记得替换 TABLE 的值。

    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = "SELECT * from <TABLE>;"
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    

检查 $DataSet.Tables[0] 的值,以查看查询结果。

禁用

若要在 VM 上禁用系统分配的标识,请将系统分配的标识的状态设为“关” 。

Screenshot shows the System assigned tab for a virtual machine where you can turn off the System assigned status.

后续步骤

本教程介绍了如何使用系统分配托管标识来访问 Azure SQL 数据库。 要了解有关 Azure SQL 数据库的详细信息,请参阅: