共用方式為


移轉 Node.js 應用程式以對 Azure SQL 資料庫使用無密碼連線

適用於:Azure SQL 資料庫

對 Azure SQL 資料庫的應用程式要求必須經過驗證。 儘管有多個選項可用於對 Azure SQL 資料庫進行驗證,但您應該盡可能優先考慮在應用程式中使用無密碼連線。 使用密碼或祕密金鑰的傳統驗證方法會帶來安全風險並提高複雜性。 請瀏覽 Azure 服務中樞的無密碼連線,深入了解移至無密碼連線的好處。

下列教學課程說明如何將現有的 Node.js 應用程式移轉至 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 資料庫驗證,進行本機開發。

登入 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
    

    顯示如何使用 Azure 查詢編輯器的螢幕擷取畫面。

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

更新本機連線設定

  1. 為您的應用程式建立環境設定。

    AZURE_SQL_SERVER=<YOURSERVERNAME>.database.windows.net
    AZURE_SQL_DATABASE=<YOURDATABASENAME>
    AZURE_SQL_PORT=1433
    
  2. 使用 Node.js SQL Driver - Tedious 連線到 Azure SQL 資料庫的現有應用程式程式碼會繼續使用無密碼連線,但有微小更改。 若要使用使用者指派的受控識別,請傳遞 authentication.typeoptions.clientId 屬性。

    import sql from 'mssql';
    
    // Environment settings - no user or password
    const server = process.env.AZURE_SQL_SERVER;
    const database = process.env.AZURE_SQL_DATABASE;
    const port = parseInt(process.env.AZURE_SQL_PORT);
    
    // Passwordless configuration
    const config = {
        server,
        port,
        database,
        authentication: {
            type: 'azure-active-directory-default',
        },
        options: {
            encrypt: true,
            clientId: process.env.AZURE_CLIENT_ID  // <----- user-assigned managed identity        
        }
    };
    
    // Existing applicaton code
    export default class Database {
        config = {};
        poolconnection = null;
        connected = false;
    
        constructor(config) {
            this.config = config;
            console.log(`Database: config: ${JSON.stringify(config)}`);
        }
    
        async connect() {
            try {
                console.log(`Database connecting...${this.connected}`);
                if (this.connected === false) {
                    this.poolconnection = await sql.connect(this.config);
                    this.connected = true;
                    console.log('Database connection successful');
                } else {
                    console.log('Database already connected');
                }
            } catch (error) {
                console.error(`Error connecting to database: ${JSON.stringify(error)}`);
            }
        }
    
        async disconnect() {
            try {
                this.poolconnection.close();
                console.log('Database connection closed');
            } catch (error) {
                console.error(`Error closing database connection: ${error}`);
            }
        }
    
        async executeQuery(query) {
            await this.connect();
            const request = this.poolconnection.request();
            const result = await request.query(query);
    
            return result.rowsAffected[0];
        }
    }
    
    const databaseClient = new Database(config);
    const result = await databaseClient.executeQuery(`select * from mytable where id = 10`);
    

    AZURE_CLIENT_ID 環境變數將在本教學課程稍後部分建立。

測試應用程式

在本機執行您的應用程式,並驗證 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 Service
  • 導覽至您 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_CLIENT_ID 環境變數,並將其設定為等於受控識別的用戶端識別碼。 可以在應用程式的 [設定] 區段中,於 Azure 入口網站中設定此變數。 可以在 Azure 入口網站受控識別資源的 [概觀] 區段中找到用戶端識別碼。

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

如果需要使用系統指派的受控識別,請省略 options.clientId 屬性。 您仍需要傳遞 authentication.type 屬性。

const config = {
  server,
  port,
  database,
  authentication: {
    type: 'azure-active-directory-default'
  },
  options: {
    encrypt: true
  }
};

測試應用程式

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

下一步

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

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