使用 SQL 数据库或 SQL 数据仓库配置和管理 Azure Active Directory 身份验证

本文介绍如何创建和填充 Azure AD,以及之后如何通过 Azure SQL 数据库SQL 数据仓库使用 Azure AD。 有关概述,请参阅 Azure Active Directory 身份验证

Note

本主题适用于 Azure SQL 服务器,同时也适用于在 Azure SQL 服务器中创建的 SQL 数据库和 SQL 数据仓库数据库。 为简单起见,在提到 SQL 数据库和 SQL 数据仓库时,本文统称 SQL 数据库。

Important

不支持使用 Azure Active Directory 帐户连接到 Azure VM 上运行的 SQL Server。 请改用域 Active Directory 帐户。

创建并填充 Azure AD

创建 Azure AD 并对其填充用户和组。 Azure AD 可以是初始 Azure AD 托管域。 Azure AD 也可以是本地 Active Directory 域服务,该服务可以与 Azure AD 联合。

有关详细信息,请参阅将本地标识与 Azure Active Directory 集成将自己的域名添加到 Azure ADMicrosoft Azure 现在支持与 Windows Server Active Directory 联合管理 Azure AD 目录使用 Windows PowerShell 管理 Azure AD混合标识所需端口和协议

为 Azure SQL Server 创建 Azure AD 管理员

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

将 Azure Active Directory 与异地复制结合使用时,必须为主服务器和辅助服务器配置 Azure Active Directory 管理员。 如果服务器没有 Azure Active Directory 管理员,则 Azure Active Directory 登录名和用户会收到“无法连接到服务器”错误。

Note

如果用户使用的不是基于 Azure AD 的帐户(包括 Azure SQL Server 管理员帐户),则无法创建基于 Azure AD 的用户,这是因为他们无权使用 Azure AD 验证建议的数据库用户。

为 Azure SQL 数据库服务器预配 Azure Active Directory 管理员

Important

如果正在预配 Azure SQL 数据库服务器或数据仓库,请执行以下步骤。

以下两个过程说明如何使用 PowerShell 在 Azure 门户中为 Azure SQL Server 预配 Azure Active Directory 管理员。

Azure 门户

  1. Azure 门户右上角,选择你的连接,以下拉可能的 Active Directory 列表。 选择正确的 Active Directory 作为默认的 Azure AD。 此步骤将与订阅关联的 Active Directory 链接到 Azure SQL Server,确保为 Azure AD 和 SQL Server 使用相同的订阅。 (Azure SQL Server 托管的可能是 Azure SQL 数据库或 Azure SQL 数据仓库。)
    选择-AD

  2. 在左侧横幅中选择“所有服务”,然后在筛选器中键入“SQL Server”。 选择“SQL 服务器”。

    sqlservers.png

    Note

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

  3. 在“SQL Server”页上,选择“Active Directory 管理员”。

  4. 在“Active Directory 管理员”页中,选择“设置管理员”。
    选择 Active Directory

  5. 在“添加管理员”页中,搜索某位用户,选择该用户或组作为管理员,然后选择“选择”。 (“Active Directory 管理员”页会显示 Active Directory 的所有成员和组。 若用户或组为灰显,则无法选择,因为不支持它们作为 Azure AD 管理员。 (请参阅将 Azure Active Directory 身份验证与使用 SQL 数据库或 SQL 数据仓库进行身份验证结合使用的“Azure AD 功能和限制”部分中支持的管理员列表。)基于角色的访问控制 (RBAC) 仅适用于该门户,不会传播到 SQL Server。
    选择管理员

  6. 在“Active Directory 管理员”页顶部,选择“保存”。
    保存管理员

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

Note

设置 Azure AD 管理员时,此新的管理员名称(用户或组)不能已作为 SQL Server 身份验证用户存在于虚拟 master 数据库中。 如果存在,Azure AD 管理员设置将失败;将回滚其创建,并指示此管理员(名称)已存在。 由于这种 SQL Server 身份验证用户不是 Azure AD 的一部分,因此使用 Azure AD 身份验证连接到服务器的任何尝试都会失败。

之后如需删除管理员,请在“Active Directory 管理员”页顶部,选择“删除管理员”,然后选择“保存”。

PowerShell

若要运行 PowerShell cmdlet,需要已安装并运行 Azure PowerShell。 有关详细信息,请参阅 如何安装和配置 Azure PowerShell

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

  • Connect-AzureRmAccount -EnvironmentName AzureChinaCloud
  • Select-AzureRmSubscription

用于预配和管理 Azure AD 管理员的 Cmdlet:

Cmdlet 名称 说明
Set-AzureRmSqlServerActiveDirectoryAdministrator 为 Azure SQL Server 或 Azure SQL 数据仓库预配 Azure Active Directory 管理员。 (必须来自当前订阅。)
Remove-AzureRmSqlServerActiveDirectoryAdministrator 删除 Azure SQL Server 或 Azure SQL 数据仓库的 Azure Active Directory 管理员。
Get-AzureRmSqlServerActiveDirectoryAdministrator 返回有关当前为 Azure SQL Server 或 Azure SQL 数据仓库配置的 Azure Active Directory 管理员的信息。

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

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

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

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

Note

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

以下示例使用可选的 ObjectID

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

Note

DisplayName 不唯一时,需要使用 Azure AD ObjectID。 若要检索 ObjectIDDisplayName 值,请使用 Azure 经典门户的 Active Directory 部分,并查看用户或组的属性。

以下示例返回有关 Azure SQL Server 的当前 Azure AD 管理员的信息:

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

以下示例删除一个 Azure AD 管理员:

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

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

CLI

也可以通过调用以下 CLI 命令来预配 Azure AD 管理员:

命令 说明
az sql server ad-admin create 为 Azure SQL Server 或 Azure SQL 数据仓库预配 Azure Active Directory 管理员。 (必须来自当前订阅。)
az sql server ad-admin delete 删除 Azure SQL Server 或 Azure SQL 数据仓库的 Azure Active Directory 管理员。
az sql server ad-admin list 返回有关为 Azure SQL Server 或 Azure SQL 数据仓库配置的当前 Azure Active Directory 管理员的信息。
az sql server ad-admin update 为 Azure SQL Server 或 Azure SQL 数据仓库更新 Azure Active Directory 管理员。

有关 CLI 命令的详细信息,请参阅 SQL - az sql

配置客户端计算机

在所有客户端计算机上,如果应用程序或用户从中使用 Azure AD 标识连接到 Azure SQL 数据库或 Azure SQL 数据仓库,则必须安装以下软件:

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

在映射到 Azure AD 标识的数据库中创建包含的数据库用户

Azure Active Directory 身份验证要求以包含的数据库用户的身份创建数据库用户。 基于 Azure AD 标识的包含的数据库用户是在 master 数据库中不具有登录名的数据库用户,它映射到与数据库相关联的 Azure AD 目录中的标识。 Azure AD 标识可以是单独的用户帐户,也可以是组。 有关包含的数据库用户的详细信息,请参阅包含的数据库用户 - 使你的数据库可移植

Note

不能使用 Azure 门户创建数据库用户(管理员除外)。 RBAC 角色不会传播到 SQL Server、SQL 数据库或 SQL 数据仓库。 Azure RBAC 角色用于管理 Azure 资源,不会应用于数据库权限。 例如, SQL Server 参与者 角色不会授予连接到 SQL 数据库或 SQL 数据仓库的访问权限。 必须使用 Transact-SQL 语句直接在数据库中授予访问权限。

若要创建基于 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;

Tip

除了与 Azure 订阅关联的 Azure Active Directory 以外,无法从 Azure Active Directory 直接创建用户。 但是,可将关联的 Active Directory 中导入的用户(称为外部用户)的其他 Active Directory 成员添加到租户 Active Directory 中的 Active Directory 组。 通过为该 AD 组创建包含的数据库用户,外部 Active Directory 中的用户可以获取对 SQL 数据库的访问权限。

有关基于 Azure Active Directory 标识创建包含的数据库用户的详细信息,请参阅 CREATE USER (Transact-SQL)

Note

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

Note

如果收到 Connection Timeout Expired 消息,则可能需要将连接字符串的 TransparentNetworkIPResolution 参数设置为 false。 有关详细信息,请参阅 .NET Framework 4.6.1 的连接超时问题 - TransparentNetworkIPResolution

创建数据库用户时,该用户会收到 CONNECT 权限,并能够以 PUBLIC 角色的成员身份连接到该数据库。 最初,仅供用户使用的权限是授予 PUBLIC 角色的任何权限,或者授予其所属任何 Azure AD 组的任何权限。 预配基于 Azure AD 的包含的数据库用户后,可以授予用户其他权限,方法与向任何其他类型的用户授予权限相同。 通常,将权限授予数据库角色,并将用户添加到角色。 有关详细信息,请参阅 数据库引擎权限基础知识。 有关特殊 SQL 数据库角色的详细信息,请参阅在 Azure SQL 数据库中管理数据库和登录名。 如果将联合域用户帐户作为外部用户导入到托管域,则此用户必须使用托管域标识。

Note

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

使用 SSMS 或 SSDT 连接到用户数据库或数据仓库

若要确认 Azure AD 管理员已正确设置,请使用 Azure AD 管理员帐户连接到 master 数据库。 若要预配基于 Azure AD 的包含的数据库用户(而不是拥有数据库的服务器管理员),请使用具有数据库访问权限的 Azure AD 标识连接到数据库。

Important

SQL Server 2016 Management Studio 和 Visual Studio 2015 中的 SQL Server Data Tools 支持 Azure Active Directory 身份验证。 2016 年 8 月版 SSMS 也包括对 Active Directory 通用身份验证的支持,这样管理员就能要求用户使用手机、短信、带 PIN 码的智能卡或移动应用通知进行多重身份验证。

使用 Azure AD 标识通过 SSMS 或 SSDT 进行连接

以下过程说明如何使用 SQL Server Management Studio 或 SQL Server 数据库工具连接到具有 Azure AD 标识的 SQL 数据库。

Active Directory 集成身份验证

如果从联合域使用 Azure Active Directory 凭据登录到 Windows,则使用此方法。

  1. 启动 Management Studio 或 Data Tools 后,在“连接到服务器”(或“连接到数据库引擎”)对话框的“身份验证”框中,选择“Active Directory - 集成”。 由于会为连接提供现有凭据,因此无需密码,也无法输入密码。

    选择 AD 集成身份验证

  2. 选择“选项”按钮,在“连接属性”页上的“连接到数据库”框中,键入所要连接的用户数据库的名称。 (仅对“通用且具有 MFA 连接”选项启用“AD 域名或租户 ID”,其余情况它会处于灰显状态。)

    选择数据库名称

Active Directory 密码身份验证

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

对于本机联合身份验证 Azure AD 用户,请使用此方法通过 Azure AD 向 SQL DB/DW 进行身份验证。 本机用户是指以显式方式在 Azure AD 中创建并使用用户名和密码进行身份验证的用户,而联合用户则是指其域与 Azure AD 联合的 Windows 用户。 当用户需要使用其 Windows 凭据(远程访问),但其本地计算机未加入域时,可以使用后一方法(用户和密码)。 在这种情况下,Windows 用户可以指定其域帐户和密码,然后使用联合凭据向 SQL DB/DW 进行身份验证。

  1. 启动 Management Studio 或 Data Tools 后,在“连接到服务器”(或“连接到数据库引擎”)对话框的“身份验证”框中,选择“Active Directory - 密码”。
  2. 在“用户名”框中,以 username@domain.com 格式键入 Azure Active Directory 用户名。 这必须是来自 Azure Active Directory 的帐户或来自与 Azure Active Directory 联合的域的帐户。
  3. 在“密码”框中,为 Azure Active Directory 帐户或联合域帐户键入用户密码。

    选择 AD 密码身份验证

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

使用 Azure AD 标识从客户端应用程序进行连接

以下过程说明如何使用 Azure AD 标识从客户端应用程序连接到 SQL 数据库。

Active Directory 集成身份验证

若要使用集成的 Windows 身份验证,域的 Active Directory 必须与 Azure Active Directory 联合。 连接到数据库的客户端应用程序(或服务)必须运行在已使用用户的域凭据加入域的计算机上。

若要使用集成的身份验证和 Azure AD 标识连接到数据库,数据库连接字符串中的身份验证关键字必须设置为 Active Directory Integrated。 下面的 C# 代码示例使用 ADO.NET。

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

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

Active Directory 密码身份验证

要使用集成的身份验证和 Azure AD 标识连接到数据库,必须将“Authentication”关键字设置为“Active Directory Password”。 连接字符串必须包含“User ID/UID”和“Password/PWD”关键字和值。 下面的 C# 代码示例使用 ADO.NET。

string ConnectionString =
@"Data Source=n9lxnyuzhv.database.chinacloudapi.cn; Authentication=Active Directory Password; Initial Catalog=testdb;  UID=bob@contoso.partner.onmschina.cn; PWD=MyPassWord!";
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();

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

Azure AD 令牌

此身份验证方法允许从 Azure Active Directory (AAD) 获取令牌,使中间层服务能够连接到 Azure SQL 数据库或 Azure SQL 数据仓库。 这样,便可以实现包含基于证书的身份验证的复杂方案。 必须完成四个基本步骤才能使用 Azure AD 令牌身份验证:

  1. 在 Azure Active Directory 中注册应用程序,并获取代码的客户端 ID。
  2. 创建代表应用程序的数据库用户。 (此前已在步骤 6 中完成。)
  3. 在运行应用程序的客户端计算机上创建证书。
  4. 为应用程序添加用作密钥的证书。

示例连接字符串:

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

有关详细信息,请参阅 SQL Server 安全性博客。 有关添加证书的详细信息,请参阅 Azure Active Directory 中基于证书的身份验证入门

sqlcmd

以下语句使用版本 13.1 的 sqlcmd 进行连接,该版本可从 下载中心下载。

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

后续步骤