繁体   English   中英

Snowflake:为外部 OAuth 配置 Microsoft Azure AD - 管理员同意

[英]Snowflake: Configure Microsoft Azure AD for External OAuth - admin consent

我正在使用指南为 Snowflake 中的外部 OAuth 配置 Microsoft Azure AD。 我很确定我遵循了所有步骤,因为在三个 Azure 订阅上仔细尝试并得到了相同的结果。

每次我被困在测试程序部分时,我应该向 Azure AD 发送请求以获取访问令牌:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
  --data-urlencode "client_id=<OAUTH_CLIENT_ID>" \
  --data-urlencode "client_secret=<OAUTH_CLIENT_SECRET>" \
  --data-urlencode "username=<AZURE_AD_USER>" \
  --data-urlencode "password=<AZURE_AD_USER_PASSWORD>" \
  --data-urlencode "grant_type=password" \
  --data-urlencode "scope=session:role:analyst" \
  '<AZURE_AD_OAUTH_TOKEN_ENDPOINT>'

我是订阅所有者,并且明确授予了对session:role:analyst scope 的管理员访问权限: 在此处输入图像描述

但是,我得到的不是访问令牌,而是以下响应:

{
    "error": "invalid_grant",
    "error_description": "AADSTS65001: The user or administrator has not consented to use the application with ID '...' named 'Snowflake OAuth Client'. Send an interactive authorization request for this user and resource.\r\nTrace ID: ...\r\nCorrelation ID: ...\r\nTimestamp: ...",
    "error_codes": [
        65001
    ],
    "timestamp": "...",
    "trace_id": "...",
    "correlation_id": "...",
    "suberror": "consent_required"
}

试图通过到达https://login.microsoftonline.com/{{tenant_id}}/adminconsent?client_id={{client_id}}来授予同意,并在授予同意后出现错误: AADSTS500113: No reply address is registered for the application.

找到这个并添加了 return URL http://localhost/ (不清楚为什么)。 再次同意并被重定向到 http://localhost/?admin_consent=True&tenant={{tenant_id}}# 我想这很好。

但我仍然收到AADSTS65001: The user or administrator has not consented to use the application

访问了 Microsoft 文档并发现不推荐使用grant_type=password - 有道理。

尝试过grant_type=client credentials:

curl --location --request GET 'https://login.microsoftonline.com/{{tenant_id}}/oauth2/v2.0/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id={{client_id}}' \
--data-urlencode 'scope=https://graph.microsoft.com/.default' \
--data-urlencode 'client_secret={{client_secret}}'

获得了访问令牌,但尝试使用如下连接字符串连接到 Snowflake:

connection.ConnectionString = $"account={account};host={host};authenticator=oauth;user={oauthUser};token={token};";

抛出Snowflake.Data.Client.SnowflakeDbException: 'Invalid OAuth access token. .

我怀疑这是因为scope=https://graph.microsoft.com/.default ,但是用session:scope:analyst替换它会带来这个:

{
    "error": "invalid_scope",
    "error_description": "AADSTS1002012: The provided value for scope session:scope:analyst is not valid. Client credential flows must have a scope value with /.default suffixed to the resource identifier (application ID URI).\r\nTrace ID: ...\r\nCorrelation ID: ...\r\nTimestamp: ...",
    "error_codes": [
        1002012
    ],
    "timestamp": "...",
    "trace_id": "...",
    "correlation_id": "..."
}

由于我已经偏离了官方 Snowflake 指南,因此我向社区寻求有关此问题的帮助。 提前谢谢你!

当使用资源所有者密码凭据授予流程获取访问令牌时(推荐,您确实不应该这样做),生成的访问令牌用于代表登录用户访问资源 (API)。 在 Microsoft 标识平台中,代表用户进行访问要求客户端应用程序至少被授予对所请求资源的一种委派权限。

在您的屏幕截图中,我们看到您授予“Snowflake OAuth Resource”的权限是应用程序权限(又名“应用程序角色”)。

你需要做两件事:

  1. 在资源应用程序的应用程序注册中,确保您遵循了第 1 步:在 Azure AD 中配置 OAuth 资源下的子步骤 10,并将“session:scope:analyst”定义为委派权限(范围)。
  2. 在客户端的app注册中,在API权限下,为资源选择对应的委托权限,并授予。

然后,当您 go 测试获取令牌时,请确保“范围”参数是完整的 scope 值,包括资源的标识符 URI(您在子步骤 9 中定义)。 例如,如果您的标识符 URI 是https://my.snowflake.example.com ,则“范围”值将为https://my.snowflake.example.com/session:role:analyst并且您的 cURL 请求将是:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
  --data-urlencode "client_id=<OAUTH_CLIENT_ID>" \
  --data-urlencode "client_secret=<OAUTH_CLIENT_SECRET>" \
  --data-urlencode "username=<AZURE_AD_USER>" \
  --data-urlencode "password=<AZURE_AD_USER_PASSWORD>" \
  --data-urlencode "grant_type=password" \
  --data-urlencode "scope=https://my.snowflake.example.com/session:role:analyst" \
  '<AZURE_AD_OAUTH_TOKEN_ENDPOINT>'

警告:不建议使用资源所有者密码凭据授予流程。 我建议联系建议您使用此流程的应用发行商。 以下是微软对这个问题的警告

Microsoft 建议您不要使用 ROPC 流程。 在大多数情况下,可以使用并推荐更安全的替代方案。 此流程需要对应用程序有非常高的信任度,并且会带来其他流程中不存在的风险。 您应该仅在无法使用其他更安全的流程时才使用此流程。

如果设置仍配置为“密码”类型的授权凭证,则 scope 存在问题,应在 AAD 上设置并按如下方式传递:

**session:role-<name>**

请注意,角色和名称之间的连字符不是冒号。

在您的设置中,它似乎被设置并传递为:

session:role:<name>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM