具有非唯一顯示名稱的 Microsoft Entra 登入和使用者 (預覽版)

適用於:Azure SQL 資料庫Azure SQL 受控執行個體

本文將教導您如何使用 T-SQL Object_ID 語法,在 Azure SQL 資料庫和 Azure SQL 受控執行個體中建立具有非唯一顯示名稱的 Microsoft Entra 登入和使用者。

注意

使用 WITH OBJECT_ID 在 Azure SQL 中建立使用者和登入目前處於預覽狀態。

概觀

Microsoft Entra ID 支援服務主體驗證。 不過,在 Azure SQL 中建立登入或使用者時,將服務主體與 Microsoft Entra ID 中不是唯一的顯示名稱結合使用會導致錯誤。

例如,如果應用程式 myapp 不是唯一的,則您可能會遇到下列錯誤:

Msg 33131, Level 16, State 1, Line 4 
Principal 'myapp' has a duplicate display name. Make the display name unique in Azure Active Directory and execute this statement again. 

嘗試執行下列 T-SQL 陳述式時:

CREATE LOGIN [myapp] FROM EXTERNAL PROVIDER 

WITH OBJECT_ID 延伸項目

發生重複的顯示名稱錯誤是因為 Microsoft Entra ID 允許 Microsoft Entra 應用程式 (服務主體) 的顯示名稱重複,而 Azure SQL 需要唯一的名稱才能建立 Microsoft Entra 登入和使用者。 為了緩解此問題,建立登入和使用者的資料定義語言 (Data Definition Language, DDL) 陳述式已延伸為包含 Azure 資源的物件識別碼與 WITH OBJECT_ID 子句。

注意

WITH OBJECT_ID 延伸項目目前處於公開預覽狀態。

Microsoft Entra ID 中的大多數非唯一顯示名稱都與服務主體相關,不過少數情況下,群組名稱可能也非唯一。 Microsoft Entra 使用者主體名稱是唯一的,因為兩個使用者不能有相同的使用者主體。 不過,可以使用與使用者主體名稱相同的顯示名稱來建立應用程式註冊 (服務主體)。

如果服務主體顯示名稱未重複,則應該使用預設的 CREATE LOGINCREATE USER 陳述式。 WITH OBJECT_ID 延伸項目處於公開預覽狀態,而且是實作以搭配非唯一服務主體的疑難排解修復項目。 不建議將其與唯一的服務主體搭配使用。 使用服務主體的 WITH OBJECT_ID 延伸項目而不新增尾碼將會成功執行,但所建立登入或使用者對應的服務主體並不明顯。 建議使用尾碼建立別名,以唯一標識服務主體。 SQL Server 不支援 WITH OBJECT_ID 延伸項目。

T-SQL 建立非唯一顯示名稱的登入/使用者語法

CREATE LOGIN [login_name] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = 'objectid'
CREATE USER [user_name] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = 'objectid'

使用 T-SQL DDL 支援性延伸項目建立具有物件識別碼的登入或使用者時,可以避免錯誤 33131,並指定以物件識別碼建立之登入或使用者的別名。 例如,下方將使用應用程式物件識別碼 4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx 建立登入 myapp4466e

CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = '4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx' 
  • 若要執行上述查詢,指定的物件識別碼必須存在於 Azure SQL 資源所在的 Microsoft Entra 租用戶中。 否則,CREATE 命令將會失敗,並出現錯誤訊息:Msg 37545, Level 16, State 1, Line 1 '' is not a valid object id for '' or you do not have permission.
  • 使用 CREATE LOGINCREATE USER 陳述式時,登入或使用者名稱必須包含使用者定義尾碼所延伸的原始服務主體名稱。 最佳做法是,尾碼可以包含其物件識別碼的初始部分。 例如,myapp2ba6c 適用於物件識別碼2ba6c0a3-cda4-4878-a5ca-xxxxxxxxxxxx。 不過,您也可以定義自訂尾碼。 不需要根據物件識別碼確定尾碼。

建議使用這樣的命名慣例:明確將資料庫使用者或登入關聯回 Microsoft Entra ID 中的物件。

注意

別名會遵守 sysname 的T-SQL 規格,包括長度上限為 128 個字元。 建議將尾碼限制為物件識別碼的前 5 個字元。

Microsoft Entra ID 中服務主體的顯示名稱不會同步處理至資料庫登入或使用者別名。 執行 CREATE LOGINCREATE USER 不會影響 Azure 入口網站中的顯示名稱。 同樣地,修改 Microsoft Entra ID 顯示名稱不會影響資料庫登入或使用者別名。

識別為應用程式建立的使用者

對於非唯一的服務主體,請務必驗證 Microsoft Entra 別名已關聯至正確的應用程式。 若要檢查使用者是否是為正確的服務主體 (應用程式) 建立:

  1. 從 SQL Database 中建立的使用者,取得應用程式的應用程式 ID,或 Microsoft Entra 應用程式群組的物件識別碼。 請嘗試下列查詢:

    • 若要從建立的使用者取得服務主體的應用程式 ID,請執行下列查詢:

      SELECT CAST(sid as uniqueidentifier) ApplicationID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c' 
      

      範例輸出:

      Screenshot of SSMS output for the Application ID.

      應用程式 ID 會從指定登入或使用者名稱的安全性識別碼 (SID) 轉換,我們可以執行下列查詢、比較最後幾個數位並建立日期來確認:

      SELECT SID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c' 
      

      範例輸出:

      Screenshot of SSMS output for the SID of the application.

    • 若要從建立的使用者檢查 Microsoft Entra 群組的物件識別碼,請執行下列查詢:

      SELECT CAST(sid as uniqueidentifier) ObjectID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b' 
      

      範例輸出:

      Screenshot of SSMS output for the Object ID of the Microsoft Entra group.

      若要從建立的使用者檢查 Microsoft Entra 群組的 SID,請執行下列查詢:

      SELECT SID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b' 
      

      範例輸出:

      Screenshot of SSMS output for the SID of the group.

    • 若要使用 PowerShell 取得應用程式的物件識別碼和應用程式 ID,請執行下列命令:

      Get-AzADApplication -DisplayName "myapp2ba6c"
      
  2. 移至 Azure 入口網站,然後在企業應用程式或 Microsoft Entra 群組資源中,分別檢查應用程式 ID物件識別碼。 查看它是否符合從上述查詢取得的結果。

注意

從服務主體建立使用者時,使用 WITH OBJECT_ID 子句搭配 CREATE T-SQL 陳述式時,必須提供物件識別碼。 這與您嘗試在 Azure SQL 中驗證別名時所傳回的應用程式 ID 不同。 使用此驗證處理程序,您可以在 Microsoft Entra ID 中識別與 SQL 別名相關聯的服務主體或群組,並在建立具有物件識別碼的登入或使用者時避免可能發生的錯誤。

尋找正確的物件識別碼

如需服務主體物件識別碼的相關資訊,請參閱服務主體物件。 服務主體的物件識別碼列於 Azure 入口網站 [企業應用程式] 底下的應用程式名稱旁邊。

警告

應用程式註冊 [概觀] 頁面取得的物件識別碼,與在企業應用程式 [概觀] 頁面中取得的物件識別碼不同。 如果您是在應用程式註冊 [概觀] 頁面中,請在企業應用程式 [概觀] 頁面上,選取所連結本機目錄中的受控應用程式的應用程式名稱,瀏覽至正確的物件識別碼。