使用 Azure SQL 配置和管理 Microsoft Entra 身份验证

适用于:Azure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics

本文介绍如何创建和填充 Microsoft Entra 租户,然后将 Microsoft Entra ID(旧称 Azure Active Directory)与 Azure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 配合使用。 有关概述,请参阅 Microsoft Entra 身份验证

注意

Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。

Microsoft Entra 身份验证方法

Microsoft Entra ID 支持以下身份验证方法:

创建并填充 Microsoft Entra 租户

创建 Microsoft Entra 租户,并使用用户和组填充。 Microsoft Entra 租户可以完全在 Azure 中托管,或者用于本地 Active Directory 域服务的联合。

有关详细信息,请参阅:

将 Azure 订阅关联或添加到 Microsoft Entra ID

  1. 通过将目录设为托管数据库的 Azure 订阅的一个受信任目录,将 Azure 订阅关联到 Microsoft Entra ID。 有关详细信息,请参阅将 Azure 订阅关联或添加到 Microsoft Entra 租户

  2. 在 Azure 门户中使用目录切换器切换到与域关联的订阅。

    重要

    每个 Azure 订阅均与一个 Microsoft Entra 实例存在信任关系。 此订阅信任该目录对用户、服务和设备执行身份验证。 多个订阅可以信任同一个目录,但一个订阅只能信任一个目录。 订阅与目录之间的信任关系不同于订阅与 Azure 中所有其他资源(网站、数据库等)的信任关系,后者更像是订阅的子资源。 如果某个订阅过期,则对该订阅关联的其他那些资源的访问权限也会终止。 但是,目录将保留在 Azure 中,并且用户可以将另一个订阅与该目录相关联,并继续管理目录用户。 有关资源的详细信息,请参阅了解 Azure 中的资源访问。 有关此信任关系的详细信息,请参阅如何将 Azure 订阅关联或添加到 Microsoft Entra ID

SQL 数据库中的服务器的 Microsoft Entra 管理员

Azure 中的每个逻辑服务器(托管 SQL 数据库或 Azure Synapse)开始时只使用单个服务器管理员帐户,即整个服务器的管理员。 将第二个管理员帐户创建为 Microsoft Entra 帐户。 此主体在服务器的 master 数据库中作为包含的数据库用户创建。 管理员帐户是每个用户数据库中 db_owner 角色的成员,并且以 dbo 用户身份输入每个用户数据库。 有关管理员帐户的详细信息,请参阅管理数据库和登录名

将 Microsoft Entra ID 与异地复制一起使用时,必须为主服务器和辅助服务器配置 Microsoft Entra 管理员。 如果服务器没有 Microsoft Entra 管理员,则 Microsoft Entra 登录名和用户会收到 Cannot connect 服务器错误。

注意

如果用户使用的不是基于 Microsoft Entra 的帐户(包括服务器管理员帐户),则无法创建基于 Microsoft Entra 的用户,这是因为其无权使用 Microsoft Entra ID 验证建议的数据库用户。

预配 Microsoft Entra 管理员(SQL 托管实例)

重要

若要预配 Azure SQL 托管实例,则只执行以下步骤。 在 Microsoft Entra ID 中,此操作只能由全局管理员或特权角色管理员执行。

可以在 Microsoft Entra ID 中将“目录读取者”角色分配给组。 然后,组所有者可以将托管实例标识添加为此组的成员,以便为 SQL 托管实例预配 Azure AD 管理员。 有关此功能的详细信息,请参阅 Azure SQL 的 Microsoft Entra 中的目录读取者角色

SQL 托管实例需要权限来读取 Microsoft Entra ID,以完成通过安全组成员身份验证用户身份或创建新用户等任务。 为此,必须授予 SQL 托管实例读取 Microsoft Entra ID 的权限。 可以使用 Azure 门户或 PowerShell 执行此操作。

Azure 门户

要通过 Azure 门户向 SQL 托管实例授予 Microsoft Entra ID 读取权限,请以全局管理员身份登录,然后执行以下步骤:

  1. Azure 门户中的右上角选择帐户,然后选择“切换目录”以确认哪个目录是当前目录。 如有必要,请切换目录。

    显示切换目录位置的 Azure 门户屏幕截图。

  2. 选择正确的 Microsoft Entra 目录作为当前目录。

    此步骤将与 Microsoft Entra ID 关联的订阅链接到 SQL 托管实例,确保 Microsoft Entra 租户和SQL 托管实例使用相同的订阅。

  3. 现在即可为 SQL 托管实例选择 Microsoft Entra 管理员。 为此,转到 Azure 门户中的托管实例资源,然后选择“设置”菜单下的“Microsoft Entra 管理员”。

    Azure 门户屏幕截图,其中显示了为所选 SQL 托管实例打开的“Microsoft Entra 管理员”页。

  4. 选择“Microsoft Entra 管理员”页面顶部的横幅,并为当前用户授予权限。

    用于授予 SQL 托管实例访问 Microsoft Entra ID 权限的对话框屏幕截图,其中已选择“授予权限”按钮。

  5. 成功完成操作后,右上角会显示以下通知:

    通知的屏幕截图,该通知确认已成功更新托管实例的 Microsoft Entra ID 读取权限。

  6. 在“Microsoft Entra 管理员”页面上,从导航栏中选择“设置管理员”以打开“Microsoft Entra ID”窗格。

    屏幕截图显示了在所选 SQL 托管实例的“Microsoft Entra 管理员”页上突出显示的“设置管理员”命令。

  7. 在“Microsoft Entra ID”窗格中,搜索用户,选中要成为管理员的用户或组旁边的框,按下“选择”以关闭窗格,然后返回到托管实例的“Microsoft Entra 管理员”页面。

    “Microsoft Entra ID”窗格显示当前目录中的所有成员和组。 不能选择灰显的用户或组,因为其无法充当 Microsoft Entra 管理员。 请参阅 Microsoft Entra 功能和限制中受支持的管理员列表。 Azure 基于角色的访问控制 (Azure RBAC) 仅适用于 Azure 门户,不会传播到 SQL 数据库、SQL 托管实例或 Azure Synapse。

  8. 在托管实例的“Microsoft Entra 管理员”页面的导航栏中,选择“保存”以确认 Microsoft Entra 管理员。

    “Microsoft Entra 管理员”页的屏幕截图,其中“保存”按钮位于顶行的“设置管理员”和“移除管理员”按钮的旁边。

    更改管理员的过程可能需要几分钟时间。 然后,新管理员出现在“Microsoft Entra 管理员”框中。

    对于 Microsoft Entra 用户和组,“对象 ID”显示在管理员名称旁。 对于应用程序(服务主体),将显示应用程序 ID。

在为 SQL 托管实例预配 Microsoft Entra 管理员之后,即可开始使用 CREATE LOGIN 语法创建 Microsoft Entra 服务器主体(登录名)。 有关详细信息,请参阅 SQL 托管实例概述

提示

之后如果要删除管理员,请在“Microsoft Entra 管理员”页面顶部,选择“移除管理员”,然后选择“保存”。

PowerShell

要使用 PowerShell 授予对 Microsoft Entra ID 的 SQL 托管实例读取权限,请运行以下脚本:

# This script grants "Directory Readers" permission to a service principal representing the SQL Managed Instance.
# It can be executed only by a user who is a member of the **Global Administrator** or **Privileged Roles Administrator** role.

Import-Module Microsoft.Graph.Authentication
$managedInstanceName = "<ManagedInstanceName>" # Enter the name of your managed instance
$tenantId = "<TenantId>"                       # Enter your tenant ID

Connect-MgGraph -Environment China -TenantId $tenantId -Scopes "RoleManagement.ReadWrite.Directory"
 
# Get Microsoft Entra "Directory Readers" role and create if it doesn't exist
$roleName = "Directory Readers"
$role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
if ($role -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-MgDirectoryRoleTemplate -Filter "DisplayName eq '$roleName'"
    New-MgDirectoryRoleTemplate -RoleTemplateId $roleTemplate.Id
    $role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
}

# Get service principal for your SQL Managed Instance
$roleMember = Get-MgServicePrincipal -Filter "DisplayName eq '$managedInstanceName'"
$roleMember.Count
if ($roleMember -eq $null) {
    Write-Output "Error: No service principal with name '$($managedInstanceName)' found, make sure that managedInstanceName parameter was entered correctly."
    exit
}
if (-not ($roleMember.Count -eq 1)) {
    Write-Output "Error: Multiple service principals with name '$($managedInstanceName)'"
    Write-Output $roleMember | Format-List DisplayName, Id, AppId
    exit
}

# Check if service principal is already member of Directory Readers role
$isDirReader = Get-MgDirectoryRoleMember -DirectoryRoleId $role.Id -Filter "Id eq '$($roleMember.Id)'"
if ($isDirReader -eq $null) {
    # Add principal to Directory Readers role
    Write-Output "Adding service principal '$($managedInstanceName)' to 'Directory Readers' role..."
    $body = @{
        "@odata.id"= "https://microsoftgraph.chinacloudapi.cn/v1.0/directoryObjects/{$($roleMember.Id)}"
    }
    New-MgDirectoryRoleMemberByRef -DirectoryRoleId $role.Id -BodyParameter $body
    Write-Output "'$($managedInstanceName)' service principal added to 'Directory Readers' role."
} 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 资源管理器 (RM) 模块,但所有未来的开发都是针对 Az.Sql 模块。 AzureRM 模块将至少在 2020 年 12 月之前接收 bug 修补程序。 Az 模块和 AzureRm 模块中的命令参数大体上是相同的。 若要详细了解其兼容性,请参阅新 Azure PowerShell Az 模块简介

若要预配 Microsoft Entra 管理员,请执行以下 Azure PowerShell 命令:

  • Connect-AzAccount -Environment AzureChinaCloud
  • Select-AzSubscription

下表列出了用于预配和管理 SQL 托管实例的 Microsoft Entra 管理员的 cmdlet:

Cmdlet 名称 说明
Set-AzSqlInstanceActiveDirectoryAdministrator 预配当前订阅中 SQL 托管实例的 Microsoft Entra 管理员。 (必须来自当前订阅)
Remove-AzSqlInstanceActiveDirectoryAdministrator 删除当前订阅中 SQL 托管实例的 Microsoft Entra 管理员。
Get-AzSqlInstanceActiveDirectoryAdministrator 返回当前订阅中 SQL 托管实例的 Microsoft Entra 管理员的相关信息。

以下命令获取有关名为 ManagedInstance01 的 SQL 托管实例(与名为 ResourceGroup01 的资源组关联)的 Microsoft Entra 管理员的信息。

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

以下命令为名为 ManagedInstance01 的 SQL 托管实例预配名为 DBA 的 Microsoft Entra 管理员组。 此服务器与资源组 ResourceGroup01 相关联。

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

以下命令删除名为 ManagedInstanceName01 的 SQL 托管实例的 Microsoft Entra 管理员,该实例与资源组 ResourceGroup01 相关联。

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

预配 Microsoft Entra 管理员(SQL 数据库)

重要

只有在预配 SQL 数据库或 Azure Synapse 的服务器的情况下,才执行以下步骤。

以下两个过程说明如何使用 PowerShell 在 Azure 门户中为服务器预配 Microsoft Entra 管理员。

Azure 门户

  1. Azure 门户的右上角,选择帐户,然后选择“切换目录”,打开“目录 + 订阅”页面。 选择包含 Azure SQL 数据库或 Azure Synapse Analytics 作为当前目录的 Microsoft Entra 目录。

  2. 搜索 SQL 服务器并选择 Azure SQL 数据库的逻辑服务器。

    搜索并选择“SQL Server”。

    注意

    在此页面上,在选择“SQL 服务器”前,可选择名称旁边的“星号标记”以收藏该类别,并将“SQL 服务器”添加到左侧导航菜单。

    另请考虑访问 Azure SQL 仪表板

  3. 在“SQL Server”页面上,选择“Microsoft Entra ID”。

  4. 在“Microsoft Entra ID”页面上,选择“设置管理员”以打开“Microsoft Entra ID”窗格。

    屏幕截图显示了设置 SQL 服务器的 Microsoft Entra 管理员的选项。

  5. 在“Microsoft Entra ID”窗格中,搜索用户,然后选择要成为管理员的用户或组。 使用“选择”确认选择并关闭窗格以返回逻辑服务器的 Microsoft Entra ID 页面。 (Microsoft Entra ID 窗格显示当前目录的所有成员和组。无法选择灰显的用户或组,因为其无法充当 Microsoft Entra 管理员。请参阅将 Microsoft Entra 身份验证与 SQL 数据库或 Azure Synapse 结合使用Microsoft Entra 功能和限制部分中受支持的管理员列表。)Azure 基于角色的访问控制 (Azure RBAC) 仅适用于门户,不会传播到服务器。

  6. 在逻辑服务器的“Microsoft Entra ID”页面顶部,选择“保存”。

    屏幕截图显示了用于保存 Microsoft Entra 管理员的选项。

    对于 Microsoft Entra 用户和组,“对象 ID”显示在管理员名称旁。 对于应用程序(服务主体),将显示应用程序 ID。

更改管理员的过程可能需要几分钟时间。 然后,新管理员出现在“Microsoft Entra 管理员”字段中。

注意

设置 Microsoft Entra 管理员时,此新的管理员名称(用户或组)不能作为服务器身份验证用户存在于虚拟 master 数据库中。 如果存在,则 Microsoft Entra 管理员设置会失败,并会回退,指示该管理员(名称)已存在。 由于服务器身份验证用户不是 Microsoft Entra ID 的一部分,因此无法使用 Microsoft Entra 身份验证连接服务器。

之后如果要删除管理员,请在“Microsoft Entra 管理员”页面顶部,选择“移除管理员”,然后选择“保存”。 这会禁用逻辑服务器的 Microsoft Entra 身份验证。

用于 SQL 数据库和 Azure Synapse 的 PowerShell

若要运行 PowerShell cmdlet,需要已安装并运行 Azure PowerShell。 有关详细信息,请参阅如何安装和配置 Azure PowerShell。 若要预配 Microsoft Entra 管理员,请执行以下 Azure PowerShell 命令:

  • Connect-AzAccount -Environment AzureChinaCloud
  • Select-AzSubscription

Cmdlet,用于预配和管理 SQL 数据库和 Azure Synapse 的 Microsoft Entra 管理员:

Cmdlet 名称 说明
Set-AzSqlServerActiveDirectoryAdministrator 为托管 SQL 数据库或 Azure Synapse 的服务器预配 Microsoft Entra 管理员。 (必须来自当前订阅)
Remove-AzSqlServerActiveDirectoryAdministrator 删除托管 SQL 数据库或 Azure Synapse 的服务器的 Microsoft Entra 管理员。
Get-AzSqlServerActiveDirectoryAdministrator 返回有关当前为托管 SQL 数据库或 Azure Synapse 的服务器配置的 Microsoft Entra 管理员信息。

使用 PowerShell 命令 get-help 查看其中每个命令的详细信息。 例如 get-help Set-AzSqlServerActiveDirectoryAdministrator

以下脚本为 Group-23 资源组中 demo_server 服务器预配名为 DBA_Group(对象 ID 40b79501-b343-44ed-9ce7-da4c8cc7353f)的 Microsoft Entra 管理员组:

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

DisplayName 输入参数接受 Microsoft Entra ID 显示名称或用户主体名称。 例如,DisplayName="John Smith"DisplayName="johns@contoso.com"。 对于 Microsoft Entra 组,仅支持 Microsoft Entra ID 显示名称。

注意

Azure PowerShell 命令 Set-AzSqlServerActiveDirectoryAdministrator 不会阻止为不受支持的用户预配 Microsoft Entra 管理员。 可以预配不受支持的用户,但其无法连接到数据库。

以下示例使用可选的 ObjectID

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

注意

DisplayName 不唯一时,需要使用 ObjectID。 要检索 ObjectID 和 DisplayName 值,可以在 Azure 门户的 Microsoft Entra ID 部分查看用户或组的属性。

以下示例返回有关服务器的当前 Microsoft Entra 管理员的信息:

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

以下示例删除 Microsoft Entra 管理员:

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

注意

还可以使用 REST API 预配 Microsoft Entra 管理员。 有关详细信息,请参阅 Azure SQL 数据库的 Azure SQL 数据库操作的 Service Management REST API 参考和操作

配置客户端计算机

注意

System.Data.SqlClient 使用弃用的 Azure Active Directory 身份验证库 (ADAL)。 如果使用 System.Data.SqlClient 命名空间进行 Microsoft Entra 身份验证,请将应用程序迁移到 Microsoft.Data.SqlClientMicrosoft 身份验证库 (MSAL)。 有关详细信息,请参阅结合使用 Microsoft Entra 身份验证与 SqlClient

如果要继续在应用程序中使用 ADAL.DLL,可以使用本部分中的链接来安装包含最新 ADAL.DLL 库的最新 ODBC 或 OLE DB 驱动程序。

在应用程序或用户要使用 Microsoft Entra 标识连接到 SQL 数据库或 Azure Synapse 的所有客户端计算机上,必须安装以下软件:

可以通过以下操作来满足这些要求:

创建映射到 Microsoft Entra 标识的包含用户

本部分回顾将 Microsoft Entra 身份验证与 Azure SQL 数据库、Azure SQL 托管实例和 Azure Synapse 结合使用的要求和重要注意事项。

  • 将 Microsoft Entra 身份验证与 SQL 数据库和 Azure Synapse 结合使用时,需要使用基于 Microsoft Entra 标识的包含的数据库用户。 包含的数据库用户在 master 数据库中没有登录名,且映射到与数据库关联的 Microsoft Entra ID 中的标识。 Microsoft Entra 标识可以是单独的用户帐户、组或应用程序。 有关包含的数据库用户的详细信息,请参阅包含的数据库用户 - 使你的数据库可移植。 有关基于 Microsoft Entra 标识创建包含的数据库用户的详细信息,请参阅 CREATE USER (Transact-SQL)

  • 由于 SQL 托管实例支持 Microsoft Entra 服务器主体(登录名),因此不需要使用包含的数据库用户。 因此,可以从 Microsoft Entra 用户、组或应用程序创建登录名。 这意味着可以使用 Microsoft Entra 服务器登录名(而不是包含的数据库用户)对 SQL 托管实例进行身份验证。 有关详细信息,请参阅 SQL 托管实例概述。 有关创建 Microsoft Entra 服务器主体(登录名)的语法,请参阅 CREATE LOGIN

  • 数据库用户(管理员除外)无法使用 Azure 门户创建数据库。 Microsoft Entra 角色不会传播到 SQL 数据库中的数据库、SQL 托管实例或 Azure Synapse。 Microsoft Entra 角色管理 Azure 资源,但不适用于数据库权限。 例如,“SQL Server 参与者”角色不会授予连接到 SQL 数据库、SQL 托管实例或 Azure Synapse 中的数据库的访问权限。 必须使用 Transact-SQL 语句直接在数据库中授予访问权限。

  • 无法直接为在与 Azure 订阅关联的不同 Microsoft Entra 租户中托管的标识创建数据库用户。 但是,可以将其他目录中的用户作为外部用户导入到关联的目录中。 然后,可以使用其创建可访问 SQL 数据库的包含的数据库用户。 外部用户还可以通过包含数据库用户的 Microsoft Entra 组的成员身份获得访问权限。

  • 不支持在 T-SQL 和语句中作为用户名包含特殊字符,例如冒号 : 或与号 &

重要

不支持属于超过 2048 个 Microsoft Entra 安全组的成员的 Microsoft Entra 用户和服务主体(Microsoft Entra 应用程序)登录 SQL 数据库、SQL 托管实例或 Azure Synapse 中的数据库。

要创建基于 Microsoft Entra 的包含的数据库用户(而不是拥有数据库的服务器管理员),请以至少具有 ALTER ANY USER 权限的用户身份使用 Microsoft Entra 标识连接到数据库。 在以下 T-SQL 示例中,Microsoft_Entra_principal_name 可以是 Microsoft Entra 用户的用户主体名称或 Microsoft Entra 组的显示名称。

CREATE USER [<Microsoft_Entra_principal_name>] FROM EXTERNAL PROVIDER;

示例:创建代表 Microsoft Entra 联合或托管域用户的包含的数据库用户:

CREATE USER [bob@contoso.com] FROM EXTERNAL PROVIDER;
CREATE USER [alice@fabrikam.partner.onmschina.cn] FROM EXTERNAL PROVIDER;

要创建代表 Microsoft Entra 组的包含的数据库用户,请提供组的显示名称:

CREATE USER [ICU Nurses] FROM EXTERNAL PROVIDER;

创建代表可使用 Microsoft Entra 令牌连接的应用程序的包含的数据库用户:

CREATE USER [appName] FROM EXTERNAL PROVIDER;

CREATE USER ... FROM EXTERNAL PROVIDER 命令要求 SQL 代表已登录用户访问 Microsoft Entra ID(“外部提供程序”)。 有时候,会出现导致 Microsoft Entra ID 将异常返回给 SQL 的情况。

  • 你可能会遇到 SQL 错误 33134,其中包含 Microsoft Entra ID 特定的错误消息。 错误通常会指出访问被拒绝、用户必须注册 MFA 才能访问资源,或者在第一方应用程序之间进行的访问必须通过预授权进行处理。 如果是前面的两种情况,则问题通常是由在用户的 Microsoft Entra 租户中设置的条件访问策略引起的:这些策略阻止用户访问外部提供程序。 更新条件访问策略以允许访问应用程序“00000003-0000-0000-c000-000000000000”(Microsoft Graph API 的应用程序 ID)应该就能解决此问题。 如果错误指出在第一方应用程序之间进行的访问必须通过预授权进行处理,则出现问题是因为用户以服务主体的身份登录。 如果改由用户执行命令,则命名应该会成功。
  • 如果收到 Connection Timeout Expired 消息,则可能需要将连接字符串的 TransparentNetworkIPResolution 参数设置为 false。 有关详细信息,请参阅 .NET Framework 4.6.1 的连接超时问题 - TransparentNetworkIPResolution

重要

删除服务器的 Microsoft Entra 管理员会阻止所有 Microsoft Entra 身份验证用户连接到服务器。 必要时,SQL 数据库管理员可以手动删除无法使用的 Microsoft Entra 用户。

创建数据库用户时,该用户会收到 CONNECT 权限,并能够以 PUBLIC 角色的成员身份连接到该数据库。 最初,用户可用的唯一权限被授予 PUBLIC 角色以及他们所属的任何 Microsoft Entra 组。 向基于 Microsoft Entra 的包含的数据库用户授予权限的操作方式与向任何其他类型用户授予权限相同。 建议向数据库角色授予权限,并将用户添加到这些角色,而不是直接向单个用户授予权限。 有关详细信息,请参阅 数据库引擎权限基础知识。 有关特殊 SQL 数据库角色的详细信息,请参阅在 Azure SQL 数据库中管理数据库和登录名。 如果将联合域用户帐户作为外部用户导入到托管域,则此用户必须使用托管域标识。

Microsoft Entra 用户在数据库元数据中均标记为类型 E (EXTERNAL_USER),而组则标记为类型 X (EXTERNAL_GROUPS)。 有关详细信息,请参阅 sys.database_principals

使用 SSMS 或 SSDT 连接到数据库

要确认 Microsoft Entra 管理员已正确设置,请使用 Microsoft Entra 管理员帐户连接到 master 数据库。 要创建基于 Microsoft Entra 的包含的数据库用户,请使用具有数据库访问权限且至少具有 ALTER ANY USER 权限的 Microsoft Entra 标识连接到数据库。

使用 Microsoft Entra 标识通过 SSMS 或 SSDT 连接

以下过程说明如何使用 SQL Server Management Studio (SSMS) 或 SQL Server 数据库工具 (SSDT) 连接到具有 Microsoft Entra 标识的 SQL 数据库。

Microsoft Entra ID - 集成

如果你从联合域使用 Microsoft Entra 凭据登录到 Windows,请使用此方法。

  1. 启动 SSMS 或 SSDT 后,在“连接到服务器”(或“连接到数据库引擎”)对话框的“身份验证”框中,选择“Azure Active Directory - 集成”。 无需输入密码,因为现有凭据已用于连接。

    SSMS 的屏幕截图,其中显示了 Microsoft Entra 集成身份验证。

  2. 选择“选项”按钮,在“连接属性”页上的“连接到数据库”框中,键入所要连接的用户数据库的名称。

    “选项”菜单的 SSMS 屏幕截图。

Microsoft Entra ID – 密码

使用 Microsoft Entra 托管域通过 Microsoft Entra 主体名称进行连接时,请使用此方法。 还可以在某些情况下(例如,在进行远程工作时)将其用于联合帐户,无需访问域。

使用此方法能够以 Microsoft Entra 仅限云的标识用户身份或者以使用 Microsoft Entra 混合标识的用户身份,向 SQL 数据库或 SQL 托管实例中的数据库进行身份验证。 此方法支持想要使用其 Windows 凭据,但其本地计算机未加入域(例如,使用远程访问)的用户。 在这种情况下,Windows 用户可以指定其域帐户和密码,然后可以向 SQL 数据库、SQL 托管实例或 Azure Synapse 中的数据库进行身份验证。

  1. 启动 SMS 或 SSDT 后,在“连接到服务器”(或“连接到数据库引擎”)对话框的“身份验证”框中,选择“Azure Active Directory - 密码”。

  2. 在“用户名”框中,以 username\@domain.com 格式键入 Microsoft Entra 用户名。 用户名必须是来自 Microsoft Entra ID 的帐户或来自与 Microsoft Entra ID 联合的域的帐户。

  3. 在“密码”框中,为 Microsoft Entra 帐户或联合域帐户键入用户密码

    使用 Microsoft Entra 密码身份验证的 SSMS 的屏幕截图。

  4. 选择“选项”按钮,在“连接属性”页上的“连接到数据库”框中,键入所要连接的用户数据库的名称。 (请参阅前一选项的图。)

使用 MFA 的 Microsoft Entra Universal

通过此方法可以在使用多重身份验证 (MFA) 的情况下,使用以交互方式请求的密码进行交互式身份验证。 使用此方法能够以 Microsoft Entra 仅限云的标识用户身份或者以使用 Microsoft Entra 混合标识的用户身份,向 SQL 数据库、SQL 托管实例和 Azure Synapse 中的数据库进行身份验证。

有关详细信息,请参阅结合使用 Microsoft Entra 多重身份验证和 SQL 数据库以及 Azure Synapse(SSMS 对 MFA 的支持)

Microsoft Entra ID – 服务主体

使用此方法通过 Microsoft Entra 服务主体(Microsoft Entra 应用程序)对 SQL 数据库或 SQL 托管实例中的数据库进行身份验证。 有关详细信息,请参阅使用 Azure SQL 的 Microsoft Entra 服务主体

Microsoft Entra ID – 托管标识

使用此方法通过 Microsoft Entra 托管标识对 SQL 数据库或 SQL 托管实例中的数据库进行身份验证。 有关详细信息,请参阅 Microsoft Entra 中用于 Azure SQL 的托管标识

Microsoft Entra ID – 默认

Microsoft Entra ID 的默认身份验证选项支持通过无密码和非交互式机制(包括托管标识)进行的身份验证。

使用 Microsoft Entra 身份通过 Azure 门户查询编辑器连接 Azure SQL 数据库

有关 Azure SQL 数据库的 Azure 门户查询编辑器的详细信息,请参阅快速入门:使用 Azure 门户查询编辑器查询 Azure SQL 数据库

  1. 在 Azure 门户中导航到 SQL 数据库。 例如,访问 Azure SQL 仪表板

  2. Azure 门户 的 SQL 数据库“概述”页面上,从左侧菜单中选择“查询编辑器”。

  3. 在登录屏幕上的“欢迎使用 SQL 数据库查询编辑器”下,选择“以<用户或组 ID 的身份继续>”。

    屏幕截图显示了使用 Microsoft Entra 身份验证登录到 Azure 门户查询编辑器。

使用 Microsoft Entra 标识从客户端应用程序连接

以下过程说明如何使用 Microsoft Entra 标识从客户端应用程序连接到 SQL 数据库。 使用 Microsoft Entra 标识时,这不是身份验证方法的完整列表。 有关详细信息,请参阅使用 Microsoft Entra 身份验证和 SqlClient 连接到 Azure SQL

Microsoft Entra 集成身份验证

若要使用集成的 Windows 身份验证,域的 Active Directory 必须与 Microsoft Entra ID 联合。

连接到数据库的客户端应用程序(或服务)必须运行在已使用用户的域凭据加入域的计算机上。

要使用集成的身份验证和 Microsoft Entra 标识连接到数据库,必须将数据库连接字符串中的身份验证关键字设置为 Active Directory Integrated。 将 <database_name> 替换为你的数据库名称。 下面的 C# 代码示例使用 ADO.NET。

string ConnectionString = @"Data Source=<database_name>.database.chinacloudapi.cn; Authentication=Active Directory Integrated; Initial Catalog=testdb;";
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();

不支持使用连接字符串关键字 Integrated Security=True 连接到 Azure SQL 数据库。 进行 ODBC 连接时,需要删除空格,并将身份验证设置为 ActiveDirectoryIntegrated

Microsoft Entra 密码身份验证

要使用 Microsoft Entra 仅限云的标识用户帐户或那些使用 Microsoft Entra 混合标识的用户帐户连接到数据库,必须将身份验证关键字设置为 Active Directory Password。 连接字符串必须包含“User ID/UID”和“Password/PWD”关键字和值。 将 <database_name><email_address><password> 替换为适当的值。 下面的 C# 代码示例使用 ADO.NET。

string ConnectionString =
@"Data Source=<database_name>.database.chinacloudapi.cn; Authentication=Active Directory Password; Initial Catalog=testdb; UID=<email_address>; PWD=<password>";
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();

通过 Microsoft Entra 身份验证 GitHub 演示中提供的演示代码示例,了解有关 Microsoft Entra 身份验证方法的详细信息。

Microsoft Entra ID 访问令牌

此身份验证方法允许中间层服务通过获取 JSON Web 令牌 (JWT) 来连接到 SQL 数据库中的数据库、SQL 托管实例,或通过从 Microsoft Entra ID 获取令牌来连接到 Azure Synapse。 此方法可实现各种应用程序方案,包括使用基于证书的身份验证的服务标识、服务主体和应用程序。 必须完成四个基本步骤才能使用 Microsoft Entra 令牌身份验证:

  1. 使用 Microsoft Entra ID 注册应用程序并获取代码的客户端 ID。
  2. 创建代表应用程序的数据库用户。 (之前已在创建映射到 Microsoft Entra 标识的包含的用户部分中完成。)
  3. 在运行应用程序的客户端计算机上创建证书。
  4. 为应用程序添加用作密钥的证书。

示例连接字符串。 将 <database_name> 替换为你的数据库名称:

string ConnectionString = @"Data Source=<database_name>.database.chinacloudapi.cn; Initial Catalog=testdb;";
SqlConnection conn = new SqlConnection(ConnectionString);
conn.AccessToken = "Your JWT token";
conn.Open();

有关详细信息,请参阅 SQL Server 安全性博客

sqlcmd

以下语句使用 sqlcmd 版本 13.1 进行连接。 下载适用于 SQL Server 的 Microsoft 命令行实用程序 14.0

注意

-Gsqlcmd 命令不适用于系统标识,它需要用户主体登录名。

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

Microsoft Entra 身份验证故障排除

有关 Microsoft Entra 身份验证问题的故障排除指南,请参阅博客:使用 Azure SQL DB 和 DW 解决与 Azure AD 身份验证相关的问题