【问题标题】:Snowflake: Configure Microsoft Azure AD for External OAuth - admin consentSnowflake:为外部 OAuth 配置 Microsoft Azure AD - 管理员同意
【发布时间】:2022-02-09 09:49:17
【问题描述】:

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

每次我卡在testing procedure 部分时,我都应该向 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 范围的管理员访问权限:

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

{
    "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.

找到this 并添加了返回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 is not recommended - 是有道理的。

已尝试grant_type=client 凭据:

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 指南,因此我正在向社区寻求有关此问题的帮助。提前谢谢你!

【问题讨论】:

    标签: oauth-2.0 azure-active-directory snowflake-cloud-data-platform


    【解决方案1】:

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

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

    你需要做两件事:

    1. 在资源应用的应用注册中,确保您遵循Step 1: Configure the OAuth Resource in Azure AD 下的子步骤 10,并将“session:scope:analyst”定义为委托权限(范围)。
    2. 在客户端的应用注册中,在API权限下,选择资源对应的delegated权限,并授予。

    然后,当您去测试获取令牌时,请确保“范围”参数是完整的范围值,包括资源的标识符 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's warning on the subject

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

    【讨论】:

      【解决方案2】:

      如果设置仍然配置为“密码”类型的授权凭据,那么问题在于应该在 AAD 上设置并按如下方式传递的范围:

      **session:role-<name>**
      

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

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

      session:role:<name>
      

      我认为,通过检查在您的环境中执行的步骤以及此处的详细信息来解决此问题会更容易: https://community.snowflake.com/s/article/External-oAuth-Token-Generation-using-Azure-AD

      【讨论】:

      • 谢谢你,斯林纳特!我使用本指南,他们建议将session:role:analyst 添加到appRoles。我试过session:scope-analyst,但效果一样。
      • 角色“分析员”是否在 SF 端创建并分配给为其生成此令牌的用户?基本前提是令牌将保存用户信息和角色,并将其与 AAD 应用程序匹配以查看是否得到验证。
      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2021-02-04
      • 1970-01-01
      • 2022-01-17
      • 2020-02-19
      相关资源
      最近更新 更多