具有非唯一顯示名稱的 Microsoft Entra 登入和使用者 (預覽版)
適用於:Fabric 中的 Azure SQL 資料庫 Azure SQL 受控執行個體 SQL 資料庫
本文說明如何使用 T-SQL Object_ID
語法,在 Azure SQL 資料庫、Fabric SQL 資料庫和 Azure SQL 受控執行個體 中建立 Microsoft具有非唯一顯示名稱的 Entra 登入和使用者。
注意
使用 WITH OBJECT_ID
在 Azure SQL 資料庫 和 Azure SQL 受控執行個體 中建立使用者和登入目前處於預覽狀態。
您可以在 Fabric SQL 資料庫中建立使用者,但無法登入。
概觀
Microsoft Entra ID 支援服務主體驗證。 不過,在 Azure SQL 資料庫 和 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
子句。
注意
Microsoft Entra ID 中的大多數非唯一顯示名稱都與服務主體相關,不過少數情況下,群組名稱可能也非唯一。 Microsoft Entra 使用者主體名稱是唯一的,因為兩個使用者不能有相同的使用者主體。 不過,可以使用與使用者主體名稱相同的顯示名稱來建立應用程式註冊 (服務主體)。
如果服務主體顯示名稱未重複,則應該使用預設的 CREATE LOGIN
或 CREATE 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,並指定以物件識別碼建立之登入或使用者的別名。 例如,下列 T-SQL 範例會使用應用程式對象識別碼 4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx
來建立登入myapp4466e
。
CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER
WITH OBJECT_ID = '4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx'
- 若要執行此 T-SQL 查詢,指定的物件識別碼必須存在於 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 LOGIN
或CREATE USER
陳述式時,登入或使用者名稱必須包含使用者定義尾碼所延伸的原始服務主體名稱。 最佳做法是,尾碼可以包含其物件識別碼的初始部分。 例如,myapp2ba6c
適用於物件識別碼2ba6c0a3-cda4-4878-a5ca-xxxxxxxxxxxx
。 不過,您也可以定義自訂尾碼。 不需要根據物件識別碼確定尾碼。
建議使用這樣的命名慣例:明確將資料庫使用者或登入關聯回 Microsoft Entra ID 中的物件。
注意
別名會遵守 sysname
的T-SQL 規格,包括長度上限為 128 個字元。 建議將尾碼限制為物件識別碼的前 5 個字元。
Microsoft Entra ID 中服務主體的顯示名稱不會同步處理至資料庫登入或使用者別名。 執行 CREATE LOGIN
或 CREATE USER
不會影響 Azure 入口網站中的顯示名稱。 同樣地,修改 Microsoft Entra ID 顯示名稱不會影響資料庫登入或使用者別名。
識別為應用程式建立的使用者
對於非唯一的服務主體,請務必驗證 Microsoft Entra 別名已關聯至正確的應用程式。 若要檢查使用者是否是為正確的服務主體 (應用程式) 建立:
從 SQL Database 中建立的使用者,取得應用程式的應用程式 ID,或 Microsoft Entra 應用程式群組的物件識別碼。 請嘗試下列查詢:
若要從建立的使用者取得服務主體的應用程式 ID,請執行下列查詢:
SELECT CAST(sid as uniqueidentifier) ApplicationID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c'
範例輸出:
應用程式識別碼會從指定登入或使用者名稱的安全性識別碼 (SID) 轉換,我們可以執行下一個 T-SQL 查詢並比較最後幾個數位並建立日期來確認:
SELECT SID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c'
範例輸出:
若要從建立的使用者檢查 Microsoft Entra 群組的物件識別碼,請執行下列查詢:
SELECT CAST(sid as uniqueidentifier) ObjectID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b'
範例輸出:
若要從建立的使用者檢查 Microsoft Entra 群組的 SID,請執行下列查詢:
SELECT SID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b'
範例輸出:
若要使用 PowerShell 取得應用程式的物件識別碼和應用程式 ID,請執行下列命令:
Get-AzADApplication -DisplayName "myapp2ba6c"
移至 Azure 入口網站,然後在企業應用程式或 Microsoft Entra 群組資源中,分別檢查應用程式 ID 或物件識別碼。 查看它是否符合從上一個查詢取得的查詢。
注意
從服務主體建立使用者時,使用 WITH OBJECT_ID
子句搭配 CREATE
T-SQL 陳述式時,必須提供物件識別碼。 這與您嘗試在 Azure SQL 中驗證別名時所傳回的應用程式 ID 不同。 使用此驗證處理程序,您可以在 Microsoft Entra ID 中識別與 SQL 別名相關聯的服務主體或群組,並在建立具有物件識別碼的登入或使用者時避免可能發生的錯誤。
尋找正確的物件識別碼
如需服務主體物件識別碼的相關資訊,請參閱服務主體物件。 服務主體的物件識別碼列於 Azure 入口網站 [企業應用程式] 底下的應用程式名稱旁邊。
警告
在應用程式註冊 [概觀] 頁面取得的物件識別碼,與在企業應用程式 [概觀] 頁面中取得的物件識別碼不同。 如果您是在應用程式註冊 [概觀] 頁面中,請在企業應用程式 [概觀] 頁面上,選取所連結本機目錄中的受控應用程式的應用程式名稱,瀏覽至正確的物件識別碼。