我正在分享一个解决方案,因为我认为这对其他人有用。
按照上的说明操作后https://docs.snowflake.com/en/user-guide/oauth-azure.html为了将我们的Azure AD与Oauth集成到Snowflake,我们遇到了一个问题。Snowflake只支持每个AAD租户一个安全集成。
由于我们希望在客户端级别和用户级别同时使用集成;
create security integration (...)
external_oauth_token_user_mapping_claim = 'sub'
vs
external_oauth_token_user_mapping_claim = 'upn'
为了解决这个问题,我们在AAD中创建了两个自定义策略:
New-AzureADPolicy -Definition @('
{
"ClaimsMappingPolicy":
{
"Version":1,"IncludeBasicClaimSet":"true",
"ClaimsSchema": [{"Source":"application","ID":"objectid","JwtClaimType":"sfuser"}]
}
}') -DisplayName "SnowflakeUserObjectClaims" -Type "ClaimsMappingPolicy"
和
New-AzureADPolicy -Definition @('
{
"ClaimsMappingPolicy":
{
"Version":1,"IncludeBasicClaimSet":"true",
"ClaimsSchema": [{"Source":"user","ID":"userprincipalname","JwtClaimType":"sfuser"}]
}
}') -DisplayName "SnowflakeUserUpnClaims" -Type "ClaimsMappingPolicy"
然后,这些可以与应用程序的一个应用程序注册和用户的另一个应用软件注册相关联("Add-AzureADServicePrincipalPolicy"(。换言之,这些索赔中的每一项都将始终包括"sfuser"索赔。这还需要手动更改应用程序清单:
"acceptMappedClaims": true,
我们现在可以在Snowflake中创建安全集成,使用我们的新声明:
create security integration (...)
external_oauth_token_user_mapping_claim = 'sfuser'
Snowflake能够使用新的声明来验证我们两个app.registrations的请求。
为子孙后代添加。此字段接受列表。我使用了以下内容:
ALTER SECURITY INTEGRATION sample_integration SET EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = ('sub','upn');