Share via


移轉 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. 選取使用者,再選擇 [選取]。

    A screenshot showing how to enable Microsoft Entra admin.

設定您的本機開發環境

可以將無密碼連線設定為同時適用於本機和 Azure 託管的環境。 在本節中,您會套用設定,以允許個別使用者向 Azure SQL 資料庫驗證,進行本機開發。

登入 Azure

對於本機開發,請確定您已使用想要用於存取 Azure SQL 資料庫的同一 Azure AD 帳戶登入。 可以透過熱門的開發工具進行驗證,例如 Azure CLI 或 Azure PowerShell。 您可以驗證的開發工具因語言而異。

使用下列命令透過 Azure CLI 登入 Azure:

az login

建立資料庫使用者並指派角色

在 Azure SQL 資料庫中建立使用者。 使用者應與 [登入 Azure] 區段用於本機登入的 Azure 帳戶對應。

  1. Azure 入口網站中,瀏覽至 SQL Database,然後選取 [查詢編輯器 (預覽版)]

  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 screenshot showing how to use the Azure Query editor.

    執行這些命令會將 SQL DB 參與者角色指派給指定的帳戶。 此角色可讓身分識別讀取、寫入及修改資料庫的資料和結構描述。 如需指派的角色的詳細資訊,請參閱固定資料庫角色

更新本機連線設定

使用 Python SQL Driver - pyodbc 連線至 Azure SQL 資料庫的現有應用程式程式碼會繼續使用無密碼連線,並進行微小更改。 例如,下列程式碼在本機執行和部署到 Azure App Service 時適用於 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

提示

在此範例程式碼中,App Service 環境變數 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 會建立新的使用者指派的身分識別。

建立資源之後,選取 [移至資源] 以檢視受控識別的詳細資料。

A screenshot showing how to create a managed identity using the Azure portal.

將受控識別與您的 Web 應用程式關聯

將 Web 應用程式設定為使用您建立的使用者指派的受控識別。

完成 Azure 入口網站中的下列步驟,以將使用者指派的受控識別與您的應用程式關聯。 這些步驟也適用於下列 Azure 服務:

  • Azure Spring Apps
  • Azure 容器應用程式
  • Azure 虛擬機器
  • Azure Kubernetes Service
  • 瀏覽至 Web 應用程式的概觀頁面。
  1. 在左側導覽窗格選取 [身分識別]。

  2. [身分識別] 頁面上,切換至 [使用者指派] 索引標籤。

  3. 選取 [+ 新增] 以開啟 [新增使用者指派的受控識別] 飛出視窗。

  4. 選取先前用來建立身分識別的訂用帳戶。

  5. 依名稱搜尋 MigrationIdentity,並從搜尋結果中選取它。

  6. 選取 [新增] 以將身分識別與您的應用程式關聯。

    A screenshot showing how to assign a managed identity.

為身分識別建立資料庫使用者並指派角色

建立對應回使用者指派的受控識別的 SQL 資料庫使用者。 將必要的 SQL 角色指派給使用者,以允許您的應用程式讀取、寫入和修改資料庫資料和結構描述。

  1. 在 Azure 入口網站中,瀏覽至您的 SQL Database,然後選取 [查詢編輯器 (預覽版)]。

  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
    

    A screenshot showing how to use the Azure Query editor to create a SQL user for a managed identity.

    執行這些命令會將 SQL DB 參與者角色指派給使用者指派的受控識別。 此角色可讓身分識別讀取、寫入及修改資料庫的資料和結構描述。


重要

在企業實際執行環境中指派資料庫使用者角色時請小心。 在這些案例中,應用程式不應該使用提升權限的單一身分識別來執行所有作業。 針對特定工作設定具特定權限的多個識別,以實作最低權限的準則。

您可以在下列資源上深入了解如何設定資料庫角色和安全性:

更新連接字串

更新您的 Azure 應用程式組態,以使用無密碼連接字串格式。 格式應該與您在本機環境中所用的格式相同。

連接字串可以作為環境變數儲存在應用程式主控環境中。 下列指示針對 App Service,但其他 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 資料庫的名稱。

建立受控識別用戶端識別碼的應用程式設定

若要使用使用者指派的受控識別,請建立 AZURE_CLIENT_ID 環境變數,並將其設定為等於受控識別的用戶端識別碼。 可以在應用程式的 [設定] 區段中,於 Azure 入口網站中設定此變數。 可以在 Azure 入口網站受控識別資源的 [概觀] 區段中找到用戶端識別碼。

儲存變更,並在應用程式未自動執行時重新啟動。

注意

此移轉指南中的範例連線程式碼會在部署時使用 DefaultAzureCredential 類別。 具體而言,它使用 DefaultAzureCredential,而不需要將使用者指派的受控識別用戶端識別碼傳遞至建構函數。 在此案例中,後援是檢查 AZURE_CLIENT_ID 環境變數。 如果 AZURE_CLIENT_ID 環境變數不存在,則會在設定時使用系統指派的受控識別。

如果在 DefaultAzureCredential 建構函數中傳遞受控識別用戶端識別碼,連線程式碼仍可在本機使用並部署,因為驗證處理程序會回復到本機案例中的互動式驗證。 如需詳細資訊,請參閱適用於 Python 的 Azure 身分識別用戶端程式庫

測試應用程式

測試應用程式,確保一切都能正常運作。 所有變更可能需要幾分鐘,才能透過 Azure 環境傳播。

下一步

在本教學課程中,您已了解如何將應用程式移轉至無密碼連線。

您可以閱讀下列資源,更深入探索本文所討論的概念: