利用 Power BI 实现 Snowflake SSO 登录

本主题介绍如何使用 Microsoft Power BI 实例化 Snowflake 会话,并使用单点登录 (SSO) 访问 Snowflake。

本主题内容:

概述

Snowflake 允许 Microsoft Power BI 用户使用 Snowflake 提供商凭据和 OAuth 2.0 实现,提供以 SSO 的方式访问 Snowflake 数据的体验。

此功能消除了对本地 Power BI 网关实现的需要,因为 Power BI 服务使用嵌入式 Snowflake 驱动程序连接到 Snowflake。

常规工作流程

下图总结了从 Power BI 实例化 Snowflake 会话的授权流程:

pbi sso 工作流程概述
  1. 用户使用 Microsoft Azure Active Directory 的服务 (Azure AD),登录 Power BI。

  2. (可选)Azure AD 可通过基于 SAML 的 IdP 验证用户。目前,Microsoft 仅支持将 Azure AD 用作 Power BI SSO 的 IdP。

  3. 在用户连接到 Snowflake 时,Power BI 服务会向 Azure AD 申请一个 Snowflake 令牌。

  4. Power BI 服务使用嵌入式 Snowflake 驱动程序,将 Azure AD 令牌作为连接字符串的一部分发送到 Snowflake。

  5. Snowflake 验证令牌,从令牌中提取用户名,将其映射到 Snowflake 用户,并使用用户的默认角色,为 Power BI 服务创建一个 Snowflake 会话。

先决条件

对于您的 Snowflake 账户,请在使用 Power BI SSO 功能之前验证以下几项:

  • 在 Snowflake 中,如果您使用 使用网络策略控制网络流量,则应允许 Microsoft Azure IP 地址范围 (https://www.microsoft.com/en-us/download/details.aspx?id=56519),包括托管 Snowflake 账户的 Azure 区域及其他任何必要 Azure 区域的 IP 地址范围。

    重要

    对于您的 Snowflake on Azure 账户所在 Azure 区域,创建特定于 Power BI 的网络策略,为此,请搜索 Microsoft 为相应区域提供的 JSON 下载内容。

    例如,如果您的 Snowflake on Azure 账户位于加拿大中部区域,请搜索 Microsoft 提供的适用于 PowerBI.CanadaCentral 的 JSON 下载内容。从 addressPrefixes 列表中选择 IP 地址范围。使用这些 IP,在 Snowflake 中创建或更新网络策略的地址范围。

    如果 addressPrefixes 列表为空,请联系 Microsoft 以申请更新。

    如果您使用多种 Microsoft Azure 服务(例如 Power BI、 SCIM),请联系您的 Azure 管理员以验证正确的 IP 地址范围,确保 Snowflake 网络策略包含正确的 IP 地址范围,可让用户访问 Snowflake。

  • Snowflake 中用户的 login_namenameemail 属性必须映射到 Azure AD upn 属性。如果未定义 login_name 属性,则该流程默认为 name 属性。

注意事项

使用 Power BI 网关:

支持与 Snowflake 服务的专用连接。如果需要使用这两种服务中的任何一种连接到 Snowflake,请使用内部网关进行连接。

不适用 Power BI 网关:

不支持与 Snowflake 服务的专用连接。对于 Power BI 服务和 Power BI Desktop,创建网络策略以允许 Azure Active Directory 公共 IP 地址范围。请注意,对于允许的 IP 地址,网络策略有最多 100,000 个字符的限制。

令牌和密钥:

Snowflake 尝试通过 external_oauth_jws_keys_url 属性(如下所示)中的 URL 值验证 Azure Active Directory,或通过网络策略中允许的 IP 地址加以验证(如果存在网络策略)。Microsoft 每 24 小时更新一次令牌和密钥。有关 Microsoft 更新的更多信息,请参阅 Azure Active Directory 中的令牌概述 B2C (https://docs.microsoft.com/en-us/azure/active-directory-b2c/tokens-overview)。

设置允许的角色:

默认情况下,禁止 ACCOUNTADMIN、 ORGADMIN 和 SECURITYADMIN 系统角色使用 Microsoft Power BI 实例化 Snowflake 会话。如需使用这些高权限角色,请更新 EXTERNAL_OAUTH_ALLOWED_ROLES 安全集成参数,以指定这些角色。在 EXTERNAL_OAUTH_ALLOWED_ROLES 安全集成参数中指定 ACCOUNTADMIN、 ORGADMIN 和 SECURITYADMIN 系统角色之前请务必小心。

有关更多信息,请参阅 CREATE SECURITY INTEGRATIONALTER SECURITY INTEGRATION

开始使用

本部分介绍如何在 Snowflake 中创建 Power BI 安全集成,以及如何通过 Power BI 访问 Snowflake。

创造 Power BI 安全集成

备注

如果您使用 Power BI 服务的 Power BI 网关连接到 Snowflake,或者使用 Snowflake 用户名和密码进行身份验证,则不需要完成此步骤。

要使用 Power BI 通过 SSO 访问 Snowflake 数据,需要使用 :doc:` CREATE SECURITY INTEGRATION </sql-reference/sql/create-security-integration-oauth-external>` 为 Power BI 创建安全集成,如下所示。

安全集成的 external_oauth_issuer 值范围必须正确无误。该值的一部分映射到您的 Azure AD 租户。您可以在 Power BI 租户的 About 部分中找到此值。

如果您的组织具有 Power BI 服务的高级部署,请咨询 Azure AD 管理员,以获取构建颁发者 URL 的 Azure AD 租户的正确值。

例如,如果您的 Azure AD 租户 ID 是 a828b821-f44f-4698-85b2-3c6749302698,则应构造类似于 https://sts.windows.net/a828b821-f44f-4698-85b2-3c6749302698/AZURE_AD_ISSUER 值。在值得末尾包含正斜杠很重要(即 /)非常重要。

在为 AZURE_AD_ISSUER 构造值之后,执行 CREATE SECURITY INTEGRATION 命令。

如果 Snowflake 账户或 Microsoft Power BI 服务位于 Azure 美国政府版云 区域,请将 external_oauth_audience_list 属性的值设置为 https://analysis.usgovcloudapi.net/powerbi/connector/Snowflake

Microsoft Power BI 的安全集成

create security integration powerbi
    type = external_oauth
    enabled = true
    external_oauth_type = azure
    external_oauth_issuer = '<AZURE_AD_ISSUER>'
    external_oauth_jws_keys_url = 'https://login.windows.net/common/discovery/keys'
    external_oauth_audience_list = ('https://analysis.windows.net/powerbi/connector/Snowflake', 'https://analysis.windows.net/powerbi/connector/snowflake')
    external_oauth_token_user_mapping_claim = 'upn'
    external_oauth_snowflake_user_mapping_attribute = 'login_name'
Copy

针对 Microsoft Power BI 的 Azure 美国政府版安全集成

create security integration powerbi_mag
    type = external_oauth
    enabled = true
    external_oauth_type = azure
    external_oauth_issuer = '<AZURE_AD_ISSUER>'
    external_oauth_jws_keys_url = 'https://login.windows.net/common/discovery/keys'
    external_oauth_audience_list = ('https://analysis.usgovcloudapi.net/powerbi/connector/Snowflake', 'https://analysis.usgovcloudapi.net/powerbi/connector/snowflake')
    external_oauth_token_user_mapping_claim = 'upn'
    external_oauth_snowflake_user_mapping_attribute = 'login_name'
Copy

重要

只有账户管理员(即具有 ACCOUNTADMIN 角色的用户)或具有全局 CREATE INTEGRATION 权限的角色才能执行此 SQL 命令。

安全集成参数值区分大小写,您输入到安全集成中的值必须与您的环境中的值相匹配。如果大小写不匹配,则可能无法验证访问令牌,从而导致身份验证尝试失败。

您为 EXTERNAL_OAUTH_AUDIENCE_LIST 属性指定的列表值是具有大写和小写 Snowflake 名称的 URLs。在此列表中包括这两个 URLs,以确保您的客户端可以根据 Microsoft 可能期望的值连接到 Snowflake,从而形成连接。

验证所有参数值,确定其是否完全匹配。例如,如果 <AZURE_AD_ISSUER> URL 值不以反斜杠结尾,并且在 URL 末尾使用反斜杠字符创建了安全集成,则会出现错误消息。然后,必须删除安全集成对象(使用 DROP INTEGRATION),然后再次使用正确的 URL 值创建对象(使用 CREATE SECURITY INTEGRATION)。

在您的环境中,如果用户的 UPN 属性值 (https://docs.microsoft.com/en-us/azure/active-directory/hybrid/plan-connect-userprincipalname#what-is-userprincipalname) 与用户的电子邮件字段匹配,而非与 Snowflake 中的 login_name 匹配,则应将 login_name 替换为 email_address。例如:

create security integration powerbi
    type = external_oauth
    ...
    external_oauth_snowflake_user_mapping_attribute = 'email_address';
Copy

为 B2B 访客用户使用 Power BI SSO

要允许 Azure AD 企业对企业(即 B2B)访客用户使用 Microsoft Power BI 的 SSO 功能访问 Snowflake,请将 EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM 属性值设置为 'unique_name'。例如:

create security integration powerbi
  type = external_oauth
  enabled = true
  external_oauth_type = azure
  external_oauth_issuer = '<AZURE_AD_ISSUER>'
  external_oauth_jws_keys_url = 'https://login.windows.net/common/discovery/keys'
  external_oauth_audience_list = ('https://analysis.windows.net/powerbi/connector/Snowflake', 'https://analysis.windows.net/powerbi/connector/snowflake')
  external_oauth_token_user_mapping_claim = 'unique_name'
  external_oauth_snowflake_user_mapping_attribute = 'login_name';
Copy

有关更多信息,请参阅 了解 B2B 用户 (https://docs.microsoft.com/en-us/azure/active-directory/external-identities/user-properties)。

修改 External OAuth 安全集成

您可以通过对安全集成执行 ALTER 语句来更新 External OAuth 安全集成。

有关更多信息,请参阅 ALTER SECURITY INTEGRATION (External OAuth)

使用辅助角色与 Power BI SSO 功能登录 Snowflake

主要角色所需范围在外部令牌中传递。该角色是授予用户的特定角色 (session:role:<role_name>)。

默认情况下,会话中不会激活用户的默认 次要角色 (即 DEFAULT_SECONDARY_ROLES 用户属性)。

要激活会话中用户的默认次要角色,并允许在使用 External OAuth 时执行 USE SECONDARY ROLES 命令,请完成此步骤:

  1. 配置连接的安全集成。在创建安全集成(使用 CREATE SECURITY INTEGRATION)或更高版本(使用 ALTER SECURITY INTEGRATION)时,将 EXTERNAL_OAUTH_ANY_ROLE_MODE 参数值设置为 ENABLE 或 ENABLE_FOR_PRIVILEGE。

使用 Client Redirect 与 Power BI SSO 功能登录 Snowflake

Snowflake 支持将 Client Redirect 与 Power BI SSO 功能结合使用,以登录 Snowflake。

有关更多信息,请参阅 重定向客户端连接

将复制与 Power BI SSO 功能结合使用

Snowflake 支持 External OAuth 安全集成从源账户到目标账户的复制和故障切换/故障回复。

有关详细信息,请参阅 跨多个账户复制安全集成和网络策略

连接到 Snowflake Power BI

有关如何从 Power BI 连接到 Snowflake 的更多详细信息,请参阅 Power BI 文档。

  • Power BI Desktop 文档 (https://docs.microsoft.com/en-us/power-bi/desktop-connect-snowflake)

  • Power BI 服务文档 (https://docs.microsoft.com/en-us/power-bi/service-connect-snowflake)

将网络策略与 External OAuth 结合使用

目前,网络策略无法添加到 External OAuth 安全集成,这意味着不能定义适用于 Power BI 集成的网络策略。但是,您仍然可以实施广泛应用于整个 Snowflake 账户的网络策略。有关应包含在网络策略中的 Microsoft IP 地址范围的信息,请参阅本主题中的 先决条件 部分。

故障排除

  • 仓库恢复。如果给定用户尝试使用暂停的仓库,Microsoft Power BI 会显示未在 错误消息 中描述的错误消息。验证并在必要时将仓库配置为自动恢复,以解决错误消息。有关更多信息,请参阅 启动或恢复仓库

  • 尝试将 Power BI 连接到 Snowflake 时,可能会出现错误。根据错误消息,可能需要在 Microsoft 和/或 Snowflake 中进行故障排除。

    • 错误消息 描述了 Snowflake 可能会返回并在 Power BI 中显示的常见错误消息。

    • 登录历史记录 描述了如何使用 Snowflake 来验证用户是否访问过 Snowflake,上次是在何时访问的。

错误消息

下表描述了用户在 Power BI 中进行身份验证时,Snowflake 返回的错误消息:

行为

错误消息

故障排除操作

访问令牌或受众值无效。

Failed to update data source credentials: ODBC:ERROR [28000] Invalid OAuth access token. [<number>].

确认 external_oauth_issuer 参数包含正确的值。. 在 Azure AD 中,确认访问令牌是否为最新。

在 Snowflake 账户中找不到 AAD 用户。

Failed to update data source credentials: ODBC:ERROR [28000] Incorrect username or password was specified.

验证 Snowflake 中是否有该用户( namelogin_name 属性值与 Azure AD 中的用户 UPN 值匹配)。如果您要添加用户,请验证 Azure UPN 中尚不存在该 AD 值。

Snowflake 用户存在,但已禁用。

Failed to update data source credentials: ODBC:ERROR [28000] User access disabled. Contact your local system administrator.

在 Snowflake 中,运行 desc user <username>,验证 disabled 属性是否已设置为 true。如果想允许该用户,请运行 alter user <username> set disabled = true;。尝试再次从 Power BI 访问 Snowflake。

Snowflake 收到来自 Power BI 的过期 AAD 令牌。

Failed to update data source credentials: ODBC:ERROR [28000] OAuth access token expired. [<number>].

请联系 Snowflake 支持部门。

Snowflake 账户中未创建或禁用安全集成。

Failed to update data source credentials: ODBC:ERROR [28000] OAuth Authz Server Integration is not enabled.

运行 desc <security_integration_name>,以验证或重新创建安全集成。

未为用户设置默认角色。

Failed to update data source credentials: ODBC: ERROR [28000] No default role has been assigned to the user, contact a local system administrator to assign a default role and retry.

为用户设置默认角色。

未为用户授予用户的默认角色。

Test failed because of 250001 (08001): Failed to connect to DB: <host>. User's configured default role '<ROLE>' is not granted to this user. Contact your local system administrator, or attempt to login using a CLI client with a connect string selecting another role, e.g. PUBLIC.

检查用户的默认角色,并将默认角色授予用户。

登录历史记录

如果用户能访问 Power BI,但无法实例化 Snowflake 会话,可以使用任何支持的 连接器 或 Snowflake Web 界面,运行以下命令来确定用户上次访问 Snowflake 的时间。请注意,系统只会记录成功的身份验证。

use role accountadmin;
select *
from table(information_schema.login_history(dateadd('hours',-1,current_timestamp()),current_timestamp()))
order by event_timestamp;
Copy

对于每个结果,评估 USER_NAMEFIRST_AUTHENTICATION_FACTOR 列。

  • USER_NAME 值应与 先决条件 部分描述的属性映射一致。

  • FIRST_AUTHENTICATION_FACTOR 应设为 OAUTH_ACCESS_TOKEN

语言: 中文