使用 Azure SQL 設定和管理 Azure AD 驗證

適用于:Azure SQL Database Azure SQL 受控執行個體 Azure Synapse Analytics

此文章說明如何建立並填入 Azure Active Directory (Azure AD) 執行個體,然後搭配 Azure SQL DatabaseAzure SQL 受控執行個體Azure Synapse Analytics 使用 Azure AD。 如需概觀,請參閱 Azure Active Directory 驗證 (部分機器翻譯)。

Azure AD 驗證方法

Azure AD 驗證支援下列驗證方法:

  • 僅限 Azure AD 雲端的身分識別
  • 支援下列驗證的 Azure AD 混合式身分識別:
    • 具有兩個選項且與無縫單一登入 (SSO) 結合的雲端驗證
      • Azure AD 密碼雜湊驗證
      • Azure AD 傳遞驗證
    • 同盟驗證

如需 Azure AD 驗證方法以及要選擇哪一個方法的詳細資訊,請參閱針對 Azure Active Directory 混合式身分識別解決方案選擇正確的驗證方法 (部分機器翻譯)。

如需 Azure AD 混合式身分識別、設定與同步的詳細資訊,請參閱:

建立並填入 Azure AD 執行個體

建立 Azure AD 執行個體,並利用使用者和群組填入。 Azure AD 可以是初始 Azure AD 受控網域。 Azure AD 也可以是與 Azure AD 同盟的內部部署 Active Directory 網域服務。

如需詳細資訊,請參閱

將 Azure 訂用帳戶關聯或新增至 Azure Active Directory

  1. 讓目錄成為裝載資料庫之 Azure 訂用帳戶信任的目錄,以將 Azure 訂用帳戶與 Azure Active Directory 建立關聯。 如需詳細資訊,請參閱將 Azure 訂用帳戶關聯或新增至您的 Azure Active Directory 租用戶 (部分機器翻譯)。

  2. 使用 Azure 入口網站中的目錄切換器,切換至與網域建立關聯的訂用帳戶。

    重要

    每個 Azure 訂用帳戶都會與 Azure AD 執行個體有信任關係。 這表示它信任該目錄來驗證使用者、服務和裝置。 多個訂用帳戶可以信任相同的目錄,但是一個訂用帳戶只能信任一個目錄。 這個訂用帳戶與目錄之間存在的信任關係不同於訂用帳戶與所有其他 Azure 資源 (網站、資料庫等) 之間的關係,後者比較像是訂用帳戶的子資源。 如果訂用帳戶已過期,則也會停止存取與該訂用帳戶相關聯的其他資源。 但目錄會保留在 Azure 中,而且您可以將其他訂用帳戶與該目錄產生關聯,並繼續管理目錄使用者。 如需有關資源的詳細資訊,請參閱 了解 Azure 中的資源存取。 若要深入了解此信任關聯性,請參閱如何將 Azure 訂用帳戶關聯或新增至 Azure Active Directory

Azure AD 系統管理員與 SQL Database 中的伺服器

Azure 中的每部伺服器 (其裝載 SQL Database 或 Azure Synapse) 一開始只有單一伺服器系統管理員帳戶,該帳戶為整部伺服器的系統管理員。 建立第二個系統管理員帳戶作為 Azure AD 帳戶。 這個主體會建立為伺服器 master 資料庫中的自主資料庫使用者。 系統管理員帳戶是在每個使用者資料庫中擔任 db_owner 角色的成員,並以 dbo 使用者的身分進入每個使用者資料庫。 如需有關系統管理員帳戶的詳細資訊,請參閱管理資料庫和登入 (部分機器翻譯)。

將 Azure Active Directory 與異地複寫搭配使用時,必須為主要和次要伺服器設定 Azure Active Directory 系統管理員。 如果伺服器沒有 Azure Active Directory 系統管理員,則 Azure Active Directory 登入和使用者將收到 "Cannot connect to server" (無法連線到伺服器) 錯誤。

注意

如果使用者不是以 Azure AD 帳戶 (包括伺服器管理員帳戶) 為基礎,就無法建立以 Azure AD 為基礎的使用者,因為他們無權向 Azure AD 驗證建議的資料庫使用者。

佈建 Azure AD 管理員 (SQL 受控執行個體)

重要

只有當您佈建的是 Azure SQL 受控執行個體時,才需遵循這些步驟。 此作業只能由全域管理員或 Azure AD 中的特殊權限角色系統管理員執行。

在 Azure AD 中,您可以將 [目錄讀取者] 角色指派給群組。 然後,群組擁有者可以將受控執行個體身分識別新增為此群組的成員,這可讓您針對 SQL 受控執行個體佈建 Azure AD 系統管理員。 如需這項功能的詳細資訊,請參閱 Azure Active Directory 中適用於 Azure SQL 的 Directory 讀者角色

您的 SQL 受控執行個體需要有讀取 Azure AD 的權限,才能順利完成工作,例如,透過安全性群組成員資格來驗證使用者,或是建立新使用者。 若要這樣做,您必須為 SQL 受控執行個體授與讀取 Azure AD 的權限。 您可以使用 Azure 入口網站或 PowerShell 來執行此作業。

Azure 入口網站

若要使用 Azure 入口網站來為 SQL 受控執行個體授與 Azure AD 讀取權限,請在 Azure AD 中以全域管理員身分登入,然後遵循下列步驟:

  1. Azure 入口網站中,在右上角選取您的帳戶,然後選擇 [切換目錄] 以確認哪個 Active Directory 是您目前的 Active Directory。 視需要切換目錄。

    顯示要切換目錄位置的Azure 入口網站螢幕擷取畫面

  2. 選擇正確的 Active Directory 做為預設 Azure AD。

    此步驟會將與 Active Directory 相關聯的訂用帳戶連結至 SQL 受控執行個體,以確定 Azure AD 執行個體會與 SQL 受控執行個體使用相同的訂用帳戶。

  3. 瀏覽至您想要用來進行 Azure AD 整合的 SQL 受控執行個體。

    Azure 入口網站螢幕擷取畫面,其中顯示針對所選 SQL 受控實例開啟的 Active Directory 管理頁面。

  4. 選取 [Active Directory 管理員] 頁面頂端的橫幅,並對目前的使用者授與權限。

    用來將許可權授與 SQL 受控實例以存取 Active Directory 之對話方塊的螢幕擷取畫面。已選取 [授與許可權] 按鈕。

  5. 作業成功之後,右上角就會出現下列通知:

    通知的螢幕擷取畫面,確認受控實例已成功更新 Active Directory 讀取權限。

  6. 現在,您可以為 SQL 受控執行個體選擇 Azure AD 系統管理員。 若要這麼做,請在 [Active Directory 系統管理員] 頁面上,選取 [設定系統管理員] 命令。

    此螢幕擷取畫面顯示所選 SQL 受控實例的 [Active Directory 系統管理員] 頁面上醒目提示的 [設定管理員] 命令。

  7. 在 [Azure AD 系統管理員] 頁面上,搜尋使用者、選取要成為系統管理員的使用者或群組,然後選取 [選取]。

    [Active Directory 系統管理員] 頁面會顯示您 Active Directory 的所有成員和群組。 呈現灰色的使用者或群組無法選取,因為他們不受支援成為 Azure AD 系統管理員。 請參閱 Azure AD 功能和限制 中支援的系統管理員清單。 Azure 角色型存取控制 (Azure RBAC) 只適用於 Azure 入口網站,而且不會傳播至 SQL Database、SQL 受控執行個體或 Azure Synapse。

    新增 Azure Active Directory 系統管理員

  8. 在 [Active Directory 系統管理員] 頁面頂端,選取 [儲存]。

    Active Directory 系統管理員頁面的螢幕擷取畫面,其中 [設定管理員] 和 [移除系統管理員] 按鈕旁頂端列的 [儲存] 按鈕。

    變更系統管理員的程序可能需要幾分鐘的時間。 接著,新的系統管理員就會出現在 [Active Directory 系統管理員] 方塊中。

    對於 Azure AD 使用者和群組,[物件識別碼] 會顯示在系統管理員名稱旁邊。 對於應用程式 (服務主體),會顯示 [應用程式識別碼]。

為 SQL 受控執行個體佈建 Azure AD 系統管理員之後,您就可以開始使用 CREATE LOGIN 語法來建立 Azure AD 伺服器主體 (登入)。 如需詳細資訊,請參閱 SQL 受控執行個體概觀 (部分機器翻譯)。

提示

若稍後要移除系統管理員,請在 [Active Directory 系統管理員] 頁面頂端,選取 [移除系統管理員],然後選取 [儲存]

PowerShell

若要使用 PowerShell 來為 SQL 受控執行個體授與 Azure AD 讀取權限,請執行下列指令碼:

# Gives Azure Active Directory read permission to a Service Principal representing the SQL Managed Instance.
# Can be executed only by a "Global Administrator" or "Privileged Role Administrator" type of user.

$aadTenant = "<YourTenantId>" # Enter your tenant ID
$managedInstanceName = "MyManagedInstance"

# Get Azure AD role "Directory Users" and create if it doesn't exist
$roleName = "Directory Readers"
$role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq $roleName}
if ($role -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-AzureADDirectoryRoleTemplate | Where-Object {$_.displayName -eq $roleName}
    Enable-AzureADDirectoryRole -RoleTemplateId $roleTemplate.ObjectId
    $role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq $roleName}
}

# Get service principal for your SQL Managed Instance
$roleMember = Get-AzureADServicePrincipal -SearchString $managedInstanceName
$roleMember.Count
if ($roleMember -eq $null) {
    Write-Output "Error: No Service Principals with name '$    ($managedInstanceName)', make sure that managedInstanceName parameter was     entered correctly."
    exit
}
if (-not ($roleMember.Count -eq 1)) {
    Write-Output "Error: More than one service principal with name pattern '$    ($managedInstanceName)'"
    Write-Output "Dumping selected service principals...."
    $roleMember
    exit
}

# Check if service principal is already member of readers role
$allDirReaders = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId
$selDirReader = $allDirReaders | where{$_.ObjectId -match     $roleMember.ObjectId}

if ($selDirReader -eq $null) {
    # Add principal to readers role
    Write-Output "Adding service principal '$($managedInstanceName)' to     'Directory Readers' role'..."
    Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId     $roleMember.ObjectId
    Write-Output "'$($managedInstanceName)' service principal added to     'Directory Readers' role'..."

    #Write-Output "Dumping service principal '$($managedInstanceName)':"
    #$allDirReaders = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId
    #$allDirReaders | where{$_.ObjectId -match $roleMember.ObjectId}
}
else {
    Write-Output "Service principal '$($managedInstanceName)' is already     member of 'Directory Readers' role'."
}

適用於 SQL 受控執行個體的 PowerShell

若要執行 PowerShell Cmdlet,Azure PowerShell 必須已安裝且正在執行中。 如需詳細資訊,請參閱 如何安裝和設定 Azure PowerShell

重要

Azure SQL 受控執行個體仍然支援 PowerShell Azure Resource Manager (RM) 模組,但所有未來的開發都是針對 Az.Sql 模組。 AzureRM 模組在至少 2020 年 12 月之前都還會持續收到 Bug 修正。 Az 模組和 AzureRm 模組中命令的引數本質上完全相同。 如需其相容性的詳細資訊,請參閱新的 Azure PowerShell Az 模組簡介

若要佈建 Azure AD 系統管理員,請執行下列 Azure PowerShell 命令:

  • Connect-AzAccount
  • Select-AzSubscription

下表列出用來佈建及管理 SQL 受控執行個體之 Azure AD 系統管理員的 Cmdlet:

Cmdlet 名稱 Description
Set-AzSqlInstanceActiveDirectoryAdministrator 在目前的訂用帳戶中,針對 SQL 受控執行個體佈建 Azure AD 系統管理員。 (必須來自目前的訂用帳戶)
Remove-AzSqlInstanceActiveDirectoryAdministrator 在目前的訂用帳戶中,針對 SQL 受控執行個體移除 Azure AD 系統管理員。
Get-AzSqlInstanceActiveDirectoryAdministrator 在目前的訂用帳戶中,針對 SQL 受控執行個體傳回有關 Azure AD 系統管理員的資訊。

下列命令會針對名為 ManagedInstance01 的 SQL 受控執行個體取得 Azure AD 系統管理員的相關資訊,此執行個體與名為 ResourceGroup01 的資源群組相關聯。

Get-AzSqlInstanceActiveDirectoryAdministrator -ResourceGroupName "ResourceGroup01" -InstanceName "ManagedInstance01"

下列命令會針對名為 ManagedInstance01 的 SQL 受控執行個體,佈建名為 DBAs 的 Azure AD 管理員群組。 此伺服器會與資源群組 ResourceGroup01 相關聯。

Set-AzSqlInstanceActiveDirectoryAdministrator -ResourceGroupName "ResourceGroup01" -InstanceName "ManagedInstance01" -DisplayName "DBAs" -ObjectId "40b79501-b343-44ed-9ce7-da4c8cc7353b"

下列命令會針對名為 ManagedInstanceName01 的 SQL 受控執行個體移除 Azure AD 系統管理員,此執行個體與資源群組 ResourceGroup01 相關聯。

Remove-AzSqlInstanceActiveDirectoryAdministrator -ResourceGroupName "ResourceGroup01" -InstanceName "ManagedInstanceName01" -Confirm -PassThru

佈建 Azure AD 系統管理員 (SQL Database)

重要

若要針對 SQL Database 或 Azure Synapse 佈建伺服器,只需遵循下列步驟。

下列兩個程序示範如何在 Azure 入口網站中以及使用 PowerShell,針對伺服器佈建 Azure Active Directory 系統管理員。

Azure 入口網站

  1. Azure 入口網站的右上角,選取您的連線以顯示可能的 Active Directory 下拉式清單。 選擇正確的 Active Directory 做為預設 Azure AD。 此步驟會連結與訂用帳戶相關聯的 Active Directory 和伺服器,以確定 Azure AD 和伺服器會使用相同的訂用帳戶。

  2. 搜尋並選取 [SQL Server]。

    搜尋並選取 SQL 伺服器

    注意

    在此頁面上,於選取 [SQL Server] 之前,您可以選取名稱旁的星星將該類別設為「我的最愛」,並將 [SQL Server] 新增至左側的導覽列。

  3. 在 [SQL Server] 頁面上,選取 [Active Directory 系統管理員]。

  4. 在 [Active Directory 系統管理員] 頁面中,選取 [設定系統管理員]

    SQL Server 設定 Active Directory 系統管理員

  5. 在 [新增系統管理員] 頁面中,搜尋使用者,選取要成為系統管理員的使用者或群組,然後選取 [選取]。 [Active Directory 系統管理員] 頁面會顯示您 Active Directory 的所有成員和群組。 呈現灰色的使用者或群組無法選取,因為他們不受支援成為 Azure AD 系統管理員。 (請在使用 Azure Active Directory 驗證來向 SQL Database 或 Azure Synapse 進行驗證Azure AD 功能與限制一節中,參閱支援的系統管理員清單。) Azure 角色型存取控制 (Azure RBAC) 僅適用於入口網站,且不會傳播至 SQL Server。

    選取 Azure Active Directory 系統管理員

  6. 在 [Active Directory 管理員] 頁面頂端,選取 [儲存]。

    儲存管理員

    對於 Azure AD 使用者和群組,[物件識別碼] 會顯示在系統管理員名稱旁邊。 對於應用程式 (服務主體),會顯示 [應用程式識別碼]。

變更系統管理員的程序可能需要幾分鐘的時間。 接著,新的系統管理員就會出現在 [Active Directory 系統管理員] 方塊中。

注意

設定 Azure AD 系統管理員時,新的系統管理員名稱 (使用者或群組) 不得以伺服器驗證使用者的身分存在於虛擬的 master 資料庫中。 如果存在,Azure AD 系統管理員設定將會失敗;其中會復原其建立並指出這樣的系統管理員 (名稱) 已經存在。 由於此類伺服器驗證使用者並非 Azure AD 的成員,因此,使用 Azure AD 驗證連線到伺服器的一切努力都會失敗。

若稍後要移除系統管理員,請在 [Active Directory 系統管理員] 頁面頂端,選取 [移除系統管理員],然後選取 [儲存]

適用於 SQL Database 和 Azure Synapse 的 PowerShell

若要執行 PowerShell Cmdlet,Azure PowerShell 必須已安裝且正在執行中。 如需詳細資訊,請參閱 如何安裝和設定 Azure PowerShell。 若要佈建 Azure AD 系統管理員,請執行下列 Azure PowerShell 命令:

  • Connect-AzAccount
  • Select-AzSubscription

針對 SQL Database 與 Azure Synapse 用來佈建及管理 Azure AD 系統管理員的 Cmdlet:

Cmdlet 名稱 Description
Set-AzSqlServerActiveDirectoryAdministrator 針對裝載 SQL Database 或 Azure Synapse 的伺服器佈建 Azure Active Directory 系統管理員。 (必須來自目前的訂用帳戶)
Remove-AzSqlServerActiveDirectoryAdministrator 針對裝載 SQL Database 或 Azure Synapse 的伺服器移除 Azure Active Directory 系統管理員。
Get-AzSqlServerActiveDirectoryAdministrator 傳回目前已針對 SQL Database 或 Azure Synapse 設定的 Azure Active Directory 系統管理員相關資訊。

使用 PowerShell 命令 get-help 來查看這其中每個命令的詳細資訊。 例如: get-help Set-AzSqlServerActiveDirectoryAdministrator

下列指令碼會在名為 Group-23 的資源群組中,為 demo_server 伺服器佈建名為 DBA_Group (物件識別碼 40b79501-b343-44ed-9ce7-da4c8cc7353f) 的 Azure AD 系統管理員群組:

Set-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName "Group-23" -ServerName "demo_server" -DisplayName "DBA_Group"

DisplayName 輸入參數可接受 Azure AD 顯示名稱或「使用者主體名稱」。 例如,DisplayName="John Smith"DisplayName="johns@contoso.com"。 Azure AD 群組只支援 Azure AD 顯示名稱。

注意

Azure PowerShell 命令 Set-AzSqlServerActiveDirectoryAdministrator 不會阻止您針對不支援的使用者佈建 Azure AD 系統管理員。 您可以佈建不支援的使用者,但是該使用者無法連線到資料庫。

下列範例使用選用的 ObjectID

Set-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName "Group-23" -ServerName "demo_server" `
    -DisplayName "DBA_Group" -ObjectId "40b79501-b343-44ed-9ce7-da4c8cc7353f"

注意

DisplayName 並非唯一時,就需要 Azure AD ObjectID。 若要擷取 ObjectIDDisplayName 的值,請使用 Azure 傳統入口網站的 [Active Directory] 區段,然後檢視使用者或群組的屬性。

下列範例傳回伺服器目前的 Azure AD 系統管理員相關資訊:

Get-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName "Group-23" -ServerName "demo_server" | Format-List

下列範例會移除 Azure AD 系統管理員:

Remove-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName "Group-23" -ServerName "demo_server"

注意

您也可以使用 REST API 來佈建 Azure Active Directory 系統管理員。 如需詳細資訊,請參閱 Azure SQL Database 之 Azure SQL Database 作業的 Service Management REST API 參考和作業

設定用戶端電腦

注意

System.Data.SqlClient 是使用 Azure Active Directory 驗證程式庫 (ADAL),其即將淘汰。 如果您使用 System.Data.SqlClient 命名空間進行 Azure Active Directory 驗證,請將應用程式遷移至 Microsoft.Data.SqlClientMicrosoft Authentication Library (MSAL)。 如需搭配 SqlClient 使用 Azure AD 驗證的詳細資訊,請參閱搭配 SqlClient 使用 Azure Active Directory 驗證

SSMS 和 SSDT 仍會使用 Azure Active Directory Authentication Library (ADAL)。 如果您想要在應用程式中繼續使用 ADAL.DLL,可以使用本節中的連結來安裝最新的 SSMS、ODBC 和 OLE DB 驅動程式,其中包含最新的 ADAL.DLL 程式庫。

在您的應用程式或使用者使用 Azure AD 身分識別連線到 SQL Database 或 Azure Synapse 的所有用戶端電腦上,您必須安裝下列軟體:

您可以符合這些需求,方法如下︰

建立對應至 Azure AD 身分識別的自主使用者

由於 SQL 受控執行個體支援 Azure AD 伺服器主體 (登入),因此,不需要使用自主資料庫使用者。 Azure AD 伺服器主體 (登入) 可讓您從 Azure AD 使用者、群組或應用程式建立登入。 這表示您可以使用 Azure AD 伺服器登入 (而不是自主資料庫使用者),向 SQL 受控執行個體進行驗證。 如需詳細資訊,請參閱 SQL 受控執行個體概觀 (部分機器翻譯)。 如需建立 Azure AD 伺服器主體 (登入) 的語法,請參閱 CREATE LOGIN

不過,搭配 SQL Database 和 Azure Synapse 使用 Azure Active Directory 驗證,需要使用以 Azure AD 身分識別為基礎的自主資料庫使用者。 自主資料庫使用者在 master 資料庫中沒有登入,並會對應至 Azure AD 目錄中與資料庫相關聯的身分識別。 Azure AD 身分識別可以是個別的使用者帳戶或群組。 如需有關自主資料庫使用者的詳細資訊,請參閱 自主資料庫使用者 - 使資料庫可攜

注意

您無法使用 Azure 入口網站建立資料庫使用者 (系統管理員除外)。 Azure 角色不會傳播至 SQL Database、SQL 受控執行個體或 Azure Synapse 中的資料庫。 Azure 角色可用來管理 Azure 資源,而且不會套用到資料庫權限。 例如,SQL Server 參與者角色不會授與連線到 SQL Database、SQL 受控執行個體或 Azure Synapse 中之資料庫的存取權。 存取權限必須使用 Transact-SQL 陳述式直接在資料庫中授與。

警告

不支援在 T-SQL CREATE LOGINCREATE USER 陳述式中當成使用者名稱包括的特殊字元 (例如冒號 :&)。

重要

如果 Azure AD 使用者和服務主體 (Azure AD 應用程式) 屬於超過 2048 位成員的 Azure AD 安全性群組,則不支援登入 SQL Database、受控執行個體或 Azure Synapse 中的資料庫。

若要建立以 Azure AD 為基礎的自主資料庫使用者 (而非擁有資料庫的伺服器系統管理員),請以至少具有 ALTER ANY USER 權限的使用者身分,使用 Azure AD 身分識別來連線到資料庫。 然後使用下列的 Transact-SQL 語法:

CREATE USER [<Azure_AD_principal_name>] FROM EXTERNAL PROVIDER;

Azure_AD_principal_name 可以是 Azure AD 使用者的使用者主體名稱或 Azure AD 群組的顯示名稱。

範例: 建立代表 Azure AD 同盟或受控網域使用者的自主資料庫使用者:

CREATE USER [bob@contoso.com] FROM EXTERNAL PROVIDER;
CREATE USER [alice@fabrikam.onmicrosoft.com] FROM EXTERNAL PROVIDER;

若要建立代表 Azure AD 或同盟網域群組的自主資料庫使用者,請輸入安全性群組的顯示名稱:

CREATE USER [ICU Nurses] FROM EXTERNAL PROVIDER;

若要建立代表使用 Azure AD 權杖進行連線之應用程式的自主資料庫使用者︰

CREATE USER [appName] FROM EXTERNAL PROVIDER;

注意

此命令要求 SQL 代表已登入的使用者存取 Azure AD (「外部提供者」)。 有時,會發生導致 Azure AD 將例外狀況傳回 SQL 的情況。 在這些情況下,使用者將看到 SQL 錯誤 33134,其中應該包含 Azure AD 特定的錯誤訊息。 大多數情況下,此錯誤將指出存取被拒、使用者必須註冊 MFA 才能存取資源,或者必須透過預先授權來處理第一方應用程式之間的存取。 在前兩種情況下,此問題通常會由使用者的 Azure AD 租用戶中設定的條件式存取原則所導致:其防止使用者存取外部提供者。 更新條件式存取原則以允許存取應用程式 '00000003-0000-0000-c000-000000000000' (Microsoft Graph API 的應用程式識別碼),應該就能解決此問題。 如果錯誤指出必須透過預先授權來處理第一方應用程式之間的存取,則此問題的原因是使用者以服務主體的身分登入。 如果使用者改為執行命令,則其應該會成功。

提示

您無法從 Azure Active Directory 直接建立使用者,除了與您的 Azure 訂用帳戶相關聯的 Azure Active Directory 以外。 不過,在相關聯 Active Directory (稱為外部使用者) 中匯入之使用者的其他 Active Directory 成員可以新增至租用戶 Active Directory 中的 Active Directory 群組。 藉由建立該 AD 群組的自主資料庫使用者,來自外部 Active Directory 的使用者可以存取 SQL Database。

如需有關根據 Azure Active Directory 身分識別建立自主資料庫使用者的詳細資訊,請參閱 CREATE USER (Transact-SQL)

注意

針對伺服器移除 Azure Active Directory 系統管理員,可防止任何 Azure AD 驗證使用者連線到伺服器。 必要時,SQL Database 系統管理員可以手動刪除無法使用的 Azure AD 使用者。

注意

如果您收到連線逾時過期,您可能需要將 TransparentNetworkIPResolution 連接字串的參數設定為 false。 如需詳細資訊,請參閱 .NET Framework 4.6.1 的連線逾時問題 - TransparentNetworkIPResolution

當您建立資料庫使用者時,該使用者會獲得 CONNECT 權限,而可以用 PUBLIC 角色的成員身分連線到該資料庫。 一開始提供給使用者的權限僅限於已授與 PUBLIC 角色的任何權限,或已授與其所屬任何 Azure AD 群組的任何權限。 一旦您佈建以 Azure AD 為基礎的自主資料庫使用者,您可以使用您授與權限給任何其他類型使用者的相同方式,授與該使用者額外的權限。 通常會授與權限給資料庫角色並新增使用者至角色。 如需詳細資訊,請參閱 Database Engine 權限基本概念。 如需有關特殊 SQL Database 角色的詳細資訊,請參閱 管理 Azure SQL Database 的資料庫和登入。 以外部使用者身分匯入至管理網域的同盟網域使用者帳戶必須使用受控網域身分識別。

注意

Azure AD 使用者會在資料庫中繼資料中標示為類型 E (EXTERNAL_USER),而群組則標示為類型 X (EXTERNAL_GROUPS)。 如需詳細資訊,請參閱 sys.database_principals

使用 SSMS 或 SSDT 連線到資料庫

若要確認 Azure AD 系統管理員已正確設定,請使用 Azure AD 系統管理員帳戶連接到 master 資料庫。 若要佈建以 Azure AD 為基礎的自主資料庫使用者 (而非擁有資料庫的伺服器系統管理員),請利用有權存取資料庫的 Azure AD 身分識別連線到資料庫。

重要

SQL Server Management Studio (SSMS) (從 2016 年開始) 和 SQL Server Data Tools (從 2015 年開始) 提供 Azure Active Directory 驗證支援。 SSMS 的 2016 年 8 月版本也支援 Active Directory 通用驗證,讓系統管理員能夠使用電話、簡訊、含有 PIN 的智慧卡或行動應用程式通知來要求 Multi-Factor Authentication。

使用 Azure AD 身分識別以使用 SSMS 或 SSDT 進行連線

下列程序示範如何使用 SQL Server Management Studio 或 SQL Server Database Tools,利用 Azure AD 身分識別連線到 SQL Database。

Active Directory 整合驗證

如果您用來登入 Windows 的 Azure Active Directory 認證來自同盟網域,或是來自針對以傳遞驗證和密碼雜湊驗證進行無縫單一登入所設定的受控網域,請使用此方法。 如需詳細資訊,請參閱 Azure Active Directory 無縫單一登入

  1. 啟動 Management Studio 或 Data Tools,並在 [連線到伺服器] \(或 [連線到資料庫引擎]\) 對話方塊的 [驗證] 方塊中,選取 [Azure Active Directory - 整合式]。 不需要密碼或沒有密碼可輸入,因為現有的認證將會在連接時出現。

    選取 AD 整合式驗證

  2. 選取 [選項] 按鈕,然後在 [連線屬性] 頁面的 [連線到資料庫] 方塊中,鍵入您想要連線的使用者資料庫名稱。 如需詳細資訊,請參閱多重要素 Azure AD 驗證 (部分機器翻譯) 一文,以了解 SSMS 17.x 和 18.x 連線屬性之間的差異。

    選取資料庫名稱

Active Directory 密碼驗證

使用 Azure AD 受控網域連接到 Azure AD 主體名稱時,請使用這個方法。 您也可以將其用於沒有網域存取權的同盟帳戶,例如在遠端工作時。

使用此方法,利用 Azure AD 僅雲端的身分識別使用者,或使用 Azure AD 混合式身分識別的使用者,在 SQL Database 或 SQL 受控執行個體中驗證資料庫。 此方法支援想要使用其 Windows 認證,但其本機電腦並未加入網域 (例如使用遠端存取) 的使用者。 在此情況下,Windows 使用者可以指出其網域帳戶和密碼,而且可向 SQL Database、SQL 受控執行個體或 Azure Synapse 中的資料庫進行驗證。

  1. 啟動 Management Studio 或 Data Tools,並在 [連線到伺服器] \(或 [連線到資料庫引擎]\) 對話方塊的 [驗證] 方塊中,選取 [Azure Active Directory - 密碼]。

  2. 在 [使用者名稱]username@domain.com 方塊中,以 格式輸入您的 Azure Active Directory 使用者名稱。 使用者名稱必須是來自 Azure Active Directory 的帳戶或來自與 Azure Active Directory 建立同盟網域的帳戶。

  3. 在 [密碼] 方塊中,針對 Azure Active Directory 帳戶或受控/同盟網域帳戶輸入您的使用者密碼。

    選取 AD 密碼驗證

  4. 選取 [選項] 按鈕,然後在 [連線屬性] 頁面的 [連線到資料庫] 方塊中,鍵入您想要連線的使用者資料庫名稱。 (請參閱上一個選項中的圖形。)

Active Directory 互動式驗證

不論是否有多重要素驗證 (MFA),都能使用此方法進行互動式驗證,並以互動方式要求密碼。 此方法可利用 Azure AD 僅雲端的身分識別使用者,或使用 Azure AD 混合式身分識別的使用者,用來驗證 SQL Database、SQL 受控執行個體和 Azure Synapse 中的資料庫。

如需詳細資訊,請參閱對 SQL Database 和 Azure Synapse 使用多重要素 Azure AD 驗證 (對 MFA 的 SSMS 支援) (部分機器翻譯)。

從用戶端應用程式使用 Azure AD 身分識別來連接

下列程序示範如何從用戶端應用程式,使用 Azure AD 身分識別連線到 SQL Database。

Active Directory 整合驗證

若要使用整合式 Windows 驗證,網域的 Active Directory 必須與 Azure Active Directory 同盟,或者必須是針對以傳遞或密碼雜湊驗證進行無縫單一登入所設定的受控網域。 如需詳細資訊,請參閱 Azure Active Directory 無縫單一登入

連線到資料庫的用戶端應用程式 (或服務) 必須以使用者的網域認證,在已加入網域的機器上執行。

若要使用整合式驗證和 Azure AD 身分識別連線到資料庫,資料庫連接字串中的驗證關鍵字必須設定為 Active Directory Integrated。 下列 C# 程式碼範例會使用 ADO.NET。

string ConnectionString = @"Data Source=n9lxnyuzhv.database.windows.net; Authentication=Active Directory Integrated; Initial Catalog=testdb;";
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();

不支援使用連接字串關鍵字 Integrated Security=True 來連接到 Azure SQL Database。 建立 ODBC 連接時,您必須移除空格,並將「驗證」設為 'ActiveDirectoryIntegrated'。

Active Directory 密碼驗證

若要使用 Azure AD 僅雲端的身分識別使用者帳戶,或使用 Azure AD 混合式身分識別的使用者帳戶,連線到資料庫,則必須將驗證關鍵字設定為 Active Directory Password。 連接字串必須包含使用者識別碼 (UID) 及密碼 (PWD) 關鍵字和值。 下列 C# 程式碼範例會使用 ADO.NET。

string ConnectionString =
@"Data Source=n9lxnyuzhv.database.windows.net; Authentication=Active Directory Password; Initial Catalog=testdb;  UID=bob@contoso.onmicrosoft.com; PWD=MyPassWord!";
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();

深入了解使用 Azure AD 驗證 GitHub 示範上所提供之示範程式碼範例的 Azure AD 驗證方法。

Azure AD 權杖

此驗證方法可讓中介層服務取得 JSON Web 權杖 (JWT),透過從 Azure AD 取得權杖,以連線到 SQL Database、SQL 受控執行個體或 Azure Synapse 中的資料庫。 此方法使用以憑證為基礎的驗證來啟用各種應用程式案例,包括服務身分識別、服務主體和應用程式。 您必須完成四個基本步驟,才能使用 Azure AD 權杖驗證︰

  1. 向 Azure Active Directory 註冊您的應用程式,並取得程式碼的用戶端識別碼。
  2. 建立代表應用程式的資料庫使用者。 (稍早在步驟 6 中已完成)。
  3. 在執行應用程式的用戶端電腦上建立憑證。
  4. 將憑證加入應用程式當做索引鍵。

範例連接字串︰

string ConnectionString = @"Data Source=n9lxnyuzhv.database.windows.net; Initial Catalog=testdb;";
SqlConnection conn = new SqlConnection(ConnectionString);
conn.AccessToken = "Your JWT token";
conn.Open();

如需詳細資訊,請參閱 SQL Server 安全性部落格。 如需新增憑證的詳細資訊,請參閱開始在 Azure Active Directory 中使用憑證式驗證

sqlcmd

下列陳述式中使用 sqlcmd 13.1 進行連線,從 下載中心即可取得此版本。

注意

搭配 -G 命令的 sqlcmd 無法搭配系統身分識別運作,而且需要使用者主體登入。

sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -G  
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -U bob@contoso.com -P MyAADPassword -G -l 30

針對 Azure AD 驗證進行疑難排解

您可以在下列部落格中找到針對 Azure AD 驗證問題進行疑難排解的指引:https://techcommunity.microsoft.com/t5/azure-sql-database/troubleshooting-problems-related-to-azure-ad-authentication-with/ba-p/1062991 (英文)

後續步驟