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

迁移 Python 应用程序以将无密码连接用于 Azure SQL 数据库

适用于: Azure SQL 数据库

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

配置 Azure SQL 数据库

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

对于本迁移指南,请确保已将 Microsoft Entra 管理员分配到 Azure SQL 数据库。

  1. 导航到逻辑服务器的 Microsoft Entra 页。

  2. 选择“设置管理员”以打开 Microsoft Entra ID 浮出控件菜单。

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

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

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

配置本地开发环境

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

登录到 Azure

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

使用以下命令通过 Azure CLI 登录到 Azure:

az login

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

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

  1. 在 Azure 门户中,浏览到 SQL 数据库,然后选择“查询编辑器(预览)”

  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
    

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

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

更新本地连接配置

使用 Python SQL 驱动程序 - pyodbc 连接到 Azure SQL 数据库的现有应用程序代码继续使用无密码连接,但略有更改。 例如,在本地运行时和部署到 Azure 应用服务时,以下代码同时适用于 SQL 身份验证和无密码连接。

import os
import pyodbc, struct
from azure.identity import DefaultAzureCredential

connection_string = os.environ["AZURE_SQL_CONNECTIONSTRING"]

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

def get_conn():
    credential = DefaultAzureCredential(exclude_interactive_browser_credential=False)
    token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
    token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
    SQL_COPT_SS_ACCESS_TOKEN = 1256  # This connection option is defined by microsoft in msodbcsql.h
    conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
    return conn

提示

在此示例代码中,应用服务环境变量 WEBSITE_HOSTNAME 用于确定运行代码的环境。 对于其他部署方案,可以使用其他环境变量来确定环境。

若要更新引用的连接字符串 (AZURE_SQL_CONNECTIONSTRING) 进行本地开发,请使用无密码连接字符串格式:

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

测试应用程序

在本地运行应用,并验证与 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 Container Apps
  • Azure 虚拟机
  • Azure Kubernetes 服务
  • 导航到 Web 应用的概述页面。
  1. 从左侧导航菜单中,选择“标识”。

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

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

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

  5. 按名称搜索“MigrationIdentity”,并从搜索结果中选择该标识。

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

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

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

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

  1. 在 Azure 门户中,浏览到 SQL 数据库,然后选择“查询编辑器(预览)”。

  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 应用配置以使用无密码连接字符串格式。 格式应与在本地环境中使用的格式相同。

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

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

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

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

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

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

注意

本迁移指南中显示的示例连接代码会在部署时使用 DefaultAzureCredential 类。 具体来说,它使用 DefaultAzureCredential,而不将用户分配的托管标识客户端 ID 传递给构造函数。 在此方案中,回退是检查 AZURE_CLIENT_ID 环境变量。 如果 AZURE_CLIENT_ID 环境变量不存在,则将使用系统分配的托管标识(如果已配置)。

如果在 DefaultAzureCredential 构造函数中传递托管标识客户端 ID,则仍可在本地使用和部署连接代码,因为身份验证过程在本地方案中回退到交互式身份验证。 有关详细信息,请参阅适用于 Python 的 Azure 标识客户端库

测试应用程序

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

后续步骤

本教程介绍了如何将应用程序迁移到无密码连接。

可以阅读以下资源,更深入地了解本文中讨论的概念: