0

我将 java 版本 4 SDK 用于 azure cosmos db。我想使用服务主体而不是主密钥在 azure cosmos db 帐户中创建数据库。

根据本文档,我分配了服务主体DocumentDB Account ContributorCosmos DB Operator内置角色定义:

https://docs.microsoft.com/pl-pl/azure/role-based-access-control/built-in-roles#cosmos-db-operator

在添加仅包含读取元数据的新自定义角色之前,我无法创建 CosmosAsyncClient。上面提到的内置角色定义不包含它......

 TokenCredential ServicePrincipal = new ClientSecretCredentialBuilder()
            .authorityHost("https://login.microsoftonline.com")
            .tenantId(tenant_here)
            .clientId(clientid_here)
            .clientSecret(secret_from_above_client)
            .build();

 client = new CosmosClientBuilder()
                            .endpoint(AccountSettings.HOST)
                            .credential(ServicePrincipal)
                            .buildAsyncClient();

添加此角色后,客户端已创建,但我无法在其中创建数据库实例和容器作为下一步。在访问控制中,我可以看到分配了角色,因此这里的服务主体是正确的。

更重要的是,当我首先使用主密钥创建数据库和容器,然后我想使用服务主体读取/写入数据时,它可以工作(显然在添加自定义角色进行写入之后)。

然后我不知道为什么DocumentDB Account Contributor并且Cosmos DB Operator不适用于创建数据库。

4

1 回答 1

1

看起来这是java SDK中的一个错误,DocumentDB Account Contributor角色足以创建数据库和容器,因为它具有Microsoft.DocumentDb/databaseAccounts/*权限(*是通配符,它​​还包括Microsoft.DocumentDB/databaseAccounts/readMetadata你提到的)。

当我测试使用具有此角色的服务主体通过 powershell 创建数据库时New-AzCosmosDBSqlDatabase,它工作正常。使用服务主体运行此命令时,它本质上是使用Azure AD 客户端凭据流来获取令牌,然后使用令牌调用 REST API -PUT https://management.azure.com/subscriptions/xxxx/resourceGroups/xxxx/providers/Microsoft.DocumentDB/databaseAccounts/xxxx/sqlDatabases/testdb1?api-version=2020-04-01创建数据库,Java SDK本质上也是做同样的事情,所以它也应该工作。

于 2021-04-14T09:48:30.577 回答