【问题标题】:Create database inside Azure Cosmos DB account with RBAC使用 RBAC 在 Azure Cosmos DB 帐户中创建数据库
【发布时间】:2021-07-08 11:16:06
【问题描述】:

我为 azure cosmos db 使用 java 版本 4 SDK。我想使用服务主体而不是主密钥在 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 ContributorCosmos DB Operator不能用于创建数据库。

【问题讨论】:

    标签: azure-cosmosdb rbac azure-cosmosdb-sqlapi azure-java-sdk azure-service-principal


    【解决方案1】:

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

    当我测试使用具有此角色的服务主体通过 powershell New-AzCosmosDBSqlDatabase 创建数据库时,它工作正常。使用服务主体运行此命令时,它本质上是使用Azure AD client credential flow 获取令牌,然后使用令牌调用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 本质上也是做同样的事情,所以它也应该可以工作。

    【讨论】:

    • {...,"userAgent":"azsdk-java-cosmos/4.13.1 Windows10/10.0 JRE/11.0.10","statusCode":403,"resourceAddress" :"dev- sqlapi-acc-westus.documents.azure.com:443/...:"{\"code\":\"Forbidden\",\"message\":\"请求被 Auth dev-sqlapi-acc 阻止:给定的请求 [POST /dbs] 无法由数据平面中的 AAD 令牌授权。\\r\\, Microsoft.Azure.Documents.Common/2.11.0, StatusCode: Forbidden\",\"additionalErrorInfo\":null}", "innerErrorMessage":"请求被 Auth dev-sqlapi-acc 阻止:给定的请求 [POST /dbs] 不能被数据平面中的 AAD 令牌授权。
    • 感谢您的回答。我以服务主体身份登录到 azure cli,并且能够使用“az cosmosdb sql database create”创建数据库。看起来像错误。
    猜你喜欢
    • 2018-08-25
    • 2019-12-30
    • 2021-12-01
    • 1970-01-01
    • 2020-12-22
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多