共用方式為


教學課程:代表登入的使用者將 App Service 應用程式連線到 SQL Database

本教學課程示範如何模擬登入使用者 (也稱為代表流程) ,將 Azure App Service 應用程式連線到後端 Azure SQL 資料庫。 若要設定此流程,請使用 Microsoft Entra 身分識別提供者啟用 App Service 內建驗證

此連線方法比 教學課程:使用受控識別存取資料中的受控識別方法更進階,而且在企業案例中具有下列優點:

  • 消除後端服務的連線秘密,就像受控識別方法一樣。
  • 讓後端資料庫或其他 Azure 服務進一步控制要授與誰的存取權量。
  • 可讓應用程式針對已登入的使用者量身打造其資料簡報。

在本教學課程中,您會將 Microsoft Entra 驗證新增至具有 Azure SQL 資料庫後端的 .NET Web 應用程式。 您將學習如何:

  • 啟用 Azure SQL 資料庫的 Microsoft Entra 驗證。
  • 停用其他 SQL Database 驗證選項。
  • 將 Microsoft Entra ID 新增為應用程式的身分識別提供者。
  • 設定 SQL Database 使用者模擬權限。
  • 設定 App Service 以提供 SQL Database 的可用存取權杖。
  • 代表登入的 Microsoft Entra 使用者存取您的 Azure SQL 資料庫。

當您完成教學課程時,您的應用程式會代表登入的使用者安全地連線到 SQL Database。

教學課程案例的架構圖。

注意

  • 內部部署 SQL Server 不支援 Microsoft Entra ID。
  • Microsoft Entra 驗證與內部部署 Active Directory (AD) 網域服務 (DS) 中的 整合式 Windows 驗證 不同。 AD DS 和 Microsoft Entra ID 使用完全不同的驗證通訊協定。 如需詳細資訊,請參閱 Microsoft Entra Domain Services 文件

必要條件

1.使用 Microsoft Entra 驗證設定資料庫伺服器

將 Microsoft Entra 使用者指派為 Azure SQL Server 的系統管理員,以啟用 Microsoft Entra 驗證至 Azure SQL 資料庫。 Microsoft Entra 系統管理員必須是建立、匯入、同步處理或邀請至 Microsoft Entra ID 的使用者。 Microsoft Entra 使用者可能與 Azure 訂用帳戶的 Microsoft 帳戶使用者不同。

若要將 Microsoft Entra ID 使用者新增為 Azure SQL Server 的系統管理員,請執行下列 Azure CLI 命令。

  1. 搭配 、 filterupn 參數,display-nameaz ad user list取得您想要設為管理員之 Microsoft Entra ID 使用者的物件識別碼。例如,下列命令會列出 Microsoft Entra ID 使用者display-name的資訊,其名稱為姓氏。

    az ad user list --display-name "Firstname Lastname"
    

    id從輸出複製值以在下一個步驟中使用。

    提示

    您可以獨立執行 az ad user list ,以顯示 Microsoft Entra 目錄中所有使用者的資訊。

  2. 搭配參數,az sql server ad-admin createobject-id將 Microsoft Entra ID 使用者新增為 Azure SQL Server 上的系統管理員。 在下列命令中,取代<group-name>為伺服器的資源群組名稱、<server-name>伺服器名稱減去.database.windows.net尾碼,以及<entra-id>id上述az ad user list命令的輸出。

    az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id <entra-id>
    
  3. 將資料庫伺服器驗證限制為僅限 Microsoft Entra 驗證。 此步驟會停用 SQL 使用者名稱和密碼驗證。

    az sql server ad-only-auth enable --resource-group <group-name> --name <server-name>
    

2. 為您的應用程式啟用 Microsoft Entra ID 驗證

將 Microsoft Entra ID 新增為應用程式的身分識別提供者。 如需詳細資訊,請參閱為 App Service 應用程式設定 Microsoft Entra 驗證

  1. 在應用程式的 Azure 入口網站頁面上,選取左側導覽功能表中 [設定] 底下的 [驗證]。

  2. [驗證] 頁面上,選取 [新增身分識別提供者],或在 [識別提供者] 區段中選取 [新增提供者]。

  3. 在 [ 新增身分識別提供者 ] 頁面上,選取 [Microsoft ] 作為提供者。

  4. 針對 [用戶端密碼到期],選取其中一個下拉式清單選項,例如 [建議:180 天]。

  5. 保留所有預設設定,然後選取 [新增]。

    此螢幕擷取畫面顯示 [新增識別提供者] 頁面。

注意

如果您重新設定應用程式的驗證設定,權杖存放區中的權杖可能不會從新設定重新產生。 若要確保權杖重新產生,請登出並重新登入您的應用程式。 一個簡單的方法是在私人模式下使用瀏覽器。 更改應用程序中的設置後,以私人模式關閉並重新打開瀏覽器。

3. 設定 SQL 資料庫使用者模擬

授與應用程式許可權,以代表登入的 Microsoft Entra 使用者存取 SQL 資料庫。

  1. 在應用程式的 [驗證] 頁面上,在 [身分識別提供者] 底下選取您的應用程式名稱。

    應用程式註冊頁面隨即開啟。 當您新增 Microsoft Entra 提供者時,會自動產生此註冊。

  2. 選取左側導覽功能表中 [管理] 底下的 [API 許可權]。

  3. [API 許可權] 頁面上,選取 [新增許可權]。

  4. [請求 API 許可權] 畫面上,選取 [我的組織使用的 API] 索引標籤。

  5. 在搜尋方塊中輸入 Azure SQL 資料庫, 然後選取結果。

  6. 應用程式需要什麼類型的許可權下,選取委派的許可權,然後選取user_impersonation旁的複選框,然後選取新增許可權。

    [要求 API 許可權] 頁面的螢幕擷取畫面,顯示 [委派的許可權]、user_impersonation 和選取的 [新增許可權] 按鈕。

Microsoft Entra 中的應用程式註冊現在具有必要的許可權,可藉由模擬登入的使用者來連線到 SQL Database。

4.設定 App Service,以傳回可使用的存取權杖

若要設定您的應用程式,以提供 SQL 資料庫 的可用存取權杖,請將 https://database.windows.net/user_impersonation 新增為 應用程式 scope 的 Microsoft Entra 提供者 loginParameters。 下列命令會將具有自訂範圍的屬性新增至 loginParameters Microsoft Entra 身分識別提供者 login 設定。

在要求的範圍中,App Service 預設已要求 openidprofileemail 範圍。 offline_access範圍已包含在內,因此您可以重新整理權杖。 如需詳細資訊,請參閱 OpenID Connect 範圍

範圍 https://database.windows.net/user_impersonation 會參考 Azure SQL Database,並提供 JSON Web 權杖 (JWT), 以指定 SQL Database 作為權杖收件者。 這個命令用於 jq JSON 處理,該處理已安裝在 Cloud Shell 中。

authSettings=$(az webapp auth show --resource-group <group-name> --name <app-name>)
authSettings=$(echo "$authSettings" | jq '.properties' | jq '.identityProviders.azureActiveDirectory.login += {"loginParameters":["scope=openid profile email offline_access https://database.windows.net/user_impersonation"]}')
az webapp auth set --resource-group <group-name> --name <app-name> --body "$authSettings"

提示

若要使用 Web 介面 (而非 Azure CLI) 來設定必要的範圍,請使用 [設定 Microsoft Entra 提供者] 來提供重新整理權杖,並新增至 https://database.windows.net/user_impersonation 要求的範圍。

您的應用程式現在已設定為產生 SQL Database 接受的存取權杖。

注意

存取權杖會在一段時間後過期。 如需如何重新整理存取權杖而不要求使用者重新驗證您的應用程式的資訊,請參閱 重新整理驗證權杖

5.在應用程式程式碼中使用存取權杖

更新您的應用程式程式碼,將 App Service 驗證所提供的存取權杖新增至連線物件。

注意

此程式碼在本機不起作用。 如需本機偵錯的詳細資訊和替代方案,請參閱 使用App Service驗證時在本機偵錯

  1. 在設定資料庫內容的DatabaseContext.cs或其他檔案中的物件中DbContext,變更預設建構函式,以將Microsoft Entra ID 存取權杖新增至連線物件。

    public MyDatabaseContext (DbContextOptions<MyDatabaseContext> options, IHttpContextAccessor accessor)
        : base(options)
    {
        var conn = Database.GetDbConnection() as SqlConnection;
        conn.AccessToken = accessor.HttpContext.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"];
    }
    
  2. 如果您在 App Service 中呼叫 defaultConnection 連接字串,且使用 SQL 驗證搭配使用者名稱和密碼,請使用下列命令來移除連線秘密。 將 <group-name><app-name><db-server-name><db-name> 取代為您的值。

    az webapp config connection-string set --resource-group <group-name> --name <app-name> --connection-string-type SQLAzure --settings defaultConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
    

6.發佈您的變更

如果您在瀏覽器中使用 Visual Studio Code 在 GitHub 分支中變更程式碼,請從左側功能表中選取 [ 原始檔控制 ]。 輸入認可訊息,例如OBO connect,然後選取認可。

認可會對 App Service 觸發 GitHub Actions 部署。 請等候幾分鐘的時間讓部署完成。

您也可以使用下列命令在 Git Bash 中發佈變更:

git commit -am "configure managed identity"
git push azure main

如果您的程式碼位於 Visual Studio 中:

  1. [方案總管] 中以滑鼠右鍵按一下您的專案,然後選取 [發佈]。

    此螢幕擷取畫面顯示如何在 Visual Studio 的方案總管進行發佈。

  2. [ 發佈 ] 頁面上,選取 [ 發佈]。

當新的應用程式頁面顯示您的應用程式時,應用程式會代表登入的 Microsoft Entra 使用者連線到 Azure SQL 資料庫。 您應該能夠像往常一樣使用和編輯您的應用程序。

發佈後顯示 Web 應用程式的螢幕擷取畫面。

7.清除資源

在上述步驟中,您已建立資源群組中的 Azure 資源。 當您不再需要這些資源時,請執行下列命令來刪除資源群組:

az group delete --name <group-name>

此命令可能需要一些時間才能執行。

常見問題集

為什麼我收到「使用者『<權杖識別主體>』登入失敗」錯誤?

最常見的錯誤原因是 Login failed for user '<token-identified principal>'

如何在 Azure SQL Database 中新增其他 Microsoft Entra 使用者或群組?

若要新增更多使用者或群組,請使用 sqlcmdSQL Server Management Studio (SSMS) 連線到您的資料庫伺服器,並建立對應至 Microsoft Entra 身分識別的 自主資料庫使用者

下列 Transact-SQL 範例會將Microsoft Entra 身分新增至 SQL Server,並為身分識別提供一些資料庫角色:

CREATE USER [<user-or-group-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<user-or-group-name>];
ALTER ROLE db_datawriter ADD MEMBER [<user-or-group-name>];
ALTER ROLE db_ddladmin ADD MEMBER [<user-or-group-name>];
GO

如何在使用 App Service 驗證時,在本機進行偵錯?

由於 App Service 驗證是 Azure 功能,因此本教學課程中的程式碼無法在本機環境中運作。 不同於在 Azure 中執行的應用程式,您的本機程式碼不會受益於 App Service 驗證中介軟體。 您可以使用下列替代方案進行本機偵錯:

  • 使用驗證從 Active Directory Interactive 本機環境連線到 SQL Database。 此驗證流程不會登入使用者本身,但會使用登入的使用者連線到後端資料庫,以便您可以在本機測試資料庫授權。
  • 手動將存取權杖複製到程式碼中,以取代 X-MS-TOKEN-AAD-ACCESS-TOKEN 要求標頭。
  • 如果您是從 Visual Studio 部署,請使用 App Service 應用程式的遠端偵錯。

存取權杖到期時會發生什麼事?

存取權杖會在一段時間後到期。 若要了解如何重新整理存取權杖,而不需要讓使用者向應用程式重新驗證,請參閱重新整理識別提供者權杖