迁移Python应用程序以将无密码连接与Azure SQL 数据库配合使用

适用于:Azure SQL 数据库

必须对Azure SQL 数据库的应用程序请求进行身份验证。 尽管有多个选项可用于对Azure SQL 数据库进行身份验证,但应尽可能确定应用程序中的无密码连接优先级。 使用密码或密钥的传统身份验证方法会产生安全风险和复杂性。 访问 Azure 服务的 无密码连接中心,详细了解迁移到无密码连接的优势。 以下教程介绍如何迁移现有Python应用程序以连接到Azure SQL 数据库以使用无密码连接,而不是用户名和密码解决方案。

mssql-python 驱动程序提供对Microsoft Entra身份验证的内置支持,使无密码连接简单明了,只需更改最少的代码。

配置Azure SQL 数据库

无密码连接使用Microsoft Entra身份验证连接到Azure服务,包括Azure SQL 数据库。 Microsoft Entra身份验证,可以在中心位置管理标识以简化权限管理。 详细了解如何为Azure SQL 数据库配置Microsoft Entra身份验证:

在此迁移指南中,请确保已在 Azure SQL 数据库中分配了一名 Microsoft Entra 管理员。

  1. 请导航到您的逻辑服务器上的Microsoft Entra页面。

  2. 选择 Set admin 打开 Microsoft Entra ID 浮出控件菜单。

  3. 在 Microsoft Entra ID 浮出控件菜单中,搜索要分配为管理员的用户。

  4. 选择该用户,然后选择“选择”。

    一个显示如何启用 Microsoft Entra 管理员的屏幕截图。

配置本地开发环境

可以将无密码连接配置为同时适用于本地和Azure托管环境。 在本部分中,将应用配置,以允许单个用户向Azure SQL 数据库进行身份验证,以便进行本地开发。

登录到Azure

对于本地开发,请确保使用要用于访问Azure SQL 数据库的同一Microsoft Entra帐户登录。 可以通过常用的开发工具(如Azure CLI或Azure PowerShell)进行身份验证。 可用于进行身份验证的开发工具因语言而异。

使用以下命令通过Azure CLI登录Azure。 这适用于 Windows、macOS 和 Linux。

az login

创建数据库用户并分配角色

在Azure SQL 数据库中创建用户。 用户应对应于您在 登录到 Azure 部分中本地登录的 Azure 帐户。

  1. 在 Azure 门户中,浏览到 SQL 数据库并选择 Query 编辑器(预览版)。

  2. 选择屏幕右侧的“以 <your-username> 身份继续”,使用你的帐户登录到数据库。

  3. 在查询编辑器视图中,运行以下 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
    

    A 屏幕截图显示如何使用 Azure 查询编辑器.

    运行这些命令会将 SQL DB 参与者角色分配给指定的帐户。 此角色允许标识读取、写入和修改数据库的数据和架构。 有关分配的角色的详细信息,请参阅固定数据库角色。

更新本地连接配置

迁移到无密码连接的mssql-python只需要更改连接字符串。 驱动程序内置了对Microsoft Entra身份验证模式的支持,无需手动处理令牌。

from os import getenv
from dotenv import load_dotenv
from mssql_python import connect

load_dotenv()

connection_string = getenv("AZURE_SQL_CONNECTIONSTRING")

def get_all():
    with connect(connection_string) as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM Persons")
        # Do something with the data
    return

要更新引用的连接字符串(AZURE_SQL_CONNECTIONSTRING),请在项目文件夹中创建一个 .env 文件,采用无密码格式的连接字符串,并使用 ActiveDirectoryDefault 身份验证。

AZURE_SQL_CONNECTIONSTRING=Server=tcp:<database-server-name>.database.chinacloudapi.cn,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryDefault

ActiveDirectoryDefault无需交互式登录即可自动发现来自多个源(Azure CLI、环境变量、Visual Studio等)的凭据。 此方法便于开发,但会增加延迟,因为它按顺序尝试每个凭据源。

重要

ActiveDirectoryDefault 仅用于本地开发。 它会按顺序尝试多种身份验证方法,从而增加延迟,并可能导致生产中出现意外行为。 在生产环境中,针对您的场景选择合适的身份验证方法。

  • Azure 应用服务/Functions:使用 ActiveDirectoryMSI (托管身份)
  • 交互式用户登录:使用 ActiveDirectoryInteractive
  • 服务主体:使用 ActiveDirectoryServicePrincipal

测试应用程序

在本地运行应用,并验证与Azure SQL 数据库的连接是否按预期工作。 请记住,更改Azure用户和角色可能需要几分钟才能通过Azure环境传播。 你的应用程序现已配置为在本地运行,开发人员无需管理该应用程序本身的机密。

配置Azure托管环境

将应用配置为在本地使用无密码连接后,相同的代码可以在部署到Azure后对Azure SQL 数据库进行身份验证。 以下各节介绍如何将已部署的应用程序配置为使用 托管标识连接到 Azure SQL 数据库。 托管标识在 Microsoft Entra ID(以前称为 Azure Active Directory)中提供自动托管身份,以便应用程序在连接到支持 Microsoft Entra 身份验证的资源时使用。 了解有关托管标识的更多信息:

创建托管标识

使用Azure门户或Azure CLI创建用户分配的托管标识。 应用程序将使用该标识向其他服务进行身份验证。

  1. 在 Azure 门户顶部,搜索 托管标识。 选择“托管标识”结果。
  2. 选择“托管标识”概述页顶部的“+ 创建”。
  3. 在“基本信息”选项卡中,输入以下值:
    • “订阅”:选择所需的订阅。
    • “资源组”:选择所需的资源组。
    • 区域:选择你所在位置附近的区域。
    • 名称:输入标识的可识别名称,例如 MigrationIdentity。
  4. 在页面底部选择查看 + 创建。
  5. 验证检查完成后,选择“创建”。 Azure创建新的用户分配标识。

创建资源后,选择“转到资源”以查看托管标识的详细信息。

一张屏幕截图显示如何使用 Azure 门户创建托管标识。

将托管标识与 Web 应用相关联

配置 Web 应用以使用你创建的用户分配的托管标识。

在 Azure 门户中完成以下步骤,将用户分配的托管标识与应用相关联。 这些步骤适用于以下Azure服务:

  • Azure Spring Apps
  • Azure 容器应用
  • Azure虚拟机
  • Azure Kubernetes 服务
  1. 导航到 Web 应用的概述页面。

  2. 从左侧导航中选择“标识”。

  3. 在“标识”页上,切换到“用户分配”选项卡。

  4. 选择“+ 添加”,打开“添加用户分配的托管标识”浮出控件。

  5. 选择之前用于创建标识的订阅。

  6. 按名称搜索 MigrationIdentity,并从搜索结果中将其选中。

  7. 选择“添加”,以将该标识与应用相关联。

    显示如何分配托管标识的屏幕截图。

为身份创建数据库用户并分配角色

创建一个映射回用户分配的托管标识的 SQL 数据库用户。 向用户分配所需的 SQL 角色,以允许应用读取、写入和修改数据库的数据和架构。

  1. 在 Azure 门户中,浏览到 SQL 数据库并选择 Query 编辑器(预览版)。

  2. 选择屏幕右侧的“以 <username> 身份继续”,使用你的帐户登录到数据库。

  3. 在查询编辑器视图中,运行以下 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
    

    一个屏幕截图展示了如何使用 Azure 查询编辑器为托管身份创建 SQL 用户。

    运行这些命令会将 SQL DB 参与者角色分配给用户分配的托管标识。 此角色允许标识读取、写入和修改数据库的数据和架构。

重要

在企业生产环境中分配数据库用户角色时请谨慎。 在这些情况下,应用程序不应使用单个提升的权限执行所有操作。 通过为特定任务配置具有特定权限的多个标识,尝试实现最低特权原则。

若要详细了解如何配置数据库角色和安全性,可以阅读以下资源:

更新连接字符串

更新 Azure 应用配置,以使用与托管标识 ActiveDirectoryMSI 身份验证配合的免密码连接字符串格式。

连接字符串可以作为环境变量存储在应用托管环境中。 以下说明侧重于应用服务,但其他Azure托管服务提供类似的配置。

Server=tcp:<database-server-name>.database.chinacloudapi.cn,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryMSI

<database-server-name> 是Azure SQL 数据库服务器的名称,<database-name>是Azure SQL 数据库的名称。

为托管标识客户端 ID 创建应用设置

若要使用用户分配的托管标识,请创建一个 AZURE_CLIENT_ID 环境变量,并将其设置为等于托管标识的客户端 ID。 可以在Azure门户中应用的 Configuration 部分中设置此变量。 可以在 Azure 门户中托管标识资源的 Overview 节中找到客户端 ID。

保存更改并重启应用程序(如果应用程序未自动执行此操作)。

注意事项

使用用户分配的托管标识时,使用 User Id 参数在连接字符串中包含客户端 ID:

Server=tcp:<database-server-name>.database.chinacloudapi.cn,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryMSI;User Id=<managed-identity-client-id>

如果省略参数 User Id ,驱动程序将使用系统分配的托管标识(如果已配置)。

测试应用程序

测试应用,确保一切仍然正常。 通过Azure环境传播所有更改可能需要几分钟时间。