繁体   English   中英

使用来自 Azure 的托管身份连接 Azure CosmosDB 在本地和 Azure 上的应用程序 Function

[英]Connect Azure CosmosDB using Managed Identities from Azure Function App both locally and on Azure

我为 Function 应用程序创建了一个托管身份,并按照以下两个部分将其分配给DocumentDB Account Contributor

https://learn.microsoft.com/zh-cn/azure/cosmos-db/managed-identity-based-authentication#assign-a-system-assigned-managed-identity-to-a-function-app

https://learn.microsoft.com/en-us/azure/cosmos-db/managed-identity-based-authentication#grant-access-to-your-azure-cosmos-account

Microsoft.Azure.Services.AppAuthentication

当我尝试运行以下部分的代码时出现异常:

https://learn.microsoft.com/en-us/azure/cosmos-db/managed-identity-based-authentication#programmatically-access-the-azure-cosmos-db-keys

无法加载文件或程序集“System.Text.Encodings.Web,Version=6.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”。 该系统找不到指定的文件。 在 System.Text.Json.Serialization.Metadata.JsonPropertyInfo.DeterminePropertyName() 在 System.Text.Json.Serialization.Metadata.JsonPropertyInfo.GetPolicies(Nullable 1 ignoreCondition, Nullable ) 在... System.Runtime.TaskilerAkilerServices. .HandleNonSuccessAndDebuggerNotification(任务任务)在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 Cosmos.Samples.AzureFunctions.AzureFunctionsCosmosClientMI.d__7.MoveNext() 在 C:.ME\MyLab.Code\AzureCode\CosmosDB\ cosmos-do.net-v3-usage\AzureFunctions\AzureFunctionsCosmosClientMI.cs:第 85 行

Azure.身份

由于 MS 不推荐AppAuthentication ,因此我通过以下链接切换到使用Azure.Identityhttps://learn.microsoft.com/en-us/do.net/api/overview/azure/identity-readme?查看=azure-do.net

https://joonasaijala.com/2021/07/01/how-to-using-managed-identities-to-access-cosmos-db-data-via-rbac-and-disabling-authentication-via-keys/

和下面的代码

 static string cosmosUrl = "https://xxx.documents.azure.com:443/";
    private static CosmosClient client = new CosmosClient(cosmosUrl, new DefaultAzureCredential());
   var container = client.GetContainer("FamilyDatabase", "FamilyContainer");
        try
        {
            var result = await container.CreateItemAsync<Item>(data, new PartitionKey(data.LastName));
            return new OkObjectResult(result.Resource.Id);
        }
        catch (CosmosException cosmosException)
        {
            log.LogError("Creating item failed with error {0}", cosmosException.ToString());
            return new BadRequestObjectResult($"Failed to create item. Cosmos Status Code {cosmosException.StatusCode}, Sub Status Code {cosmosException.SubStatusCode}: {cosmosException.Message}.");
        }

但是,我在本地和在 Azure 中运行时都遇到了异常。

无法创建项目。 Cosmos Status Code Forbidden, Sub Status Code 5301: 响应状态码不表示成功: Forbidden (403); 子状态:5301; ActivityId:xxxx-bf03-4355-8642-5d316f9d3373; 原因:(请求被 Auth xxxx 阻止:请求被阻止,因为委托人 [xxx-2bff-44e9-97be-9ffeb3aae3ee] 没有对资源 [/] 执行操作 [Microsoft.DocumentDB/databaseAccounts/readMetadata] 所需的 RBAC 权限。学习更多: https://aka.ms/cosmos-native-rbac .ActivityId :xxx-bf03-4355-8642-5d316f9d3373,Microsoft.Azure.Documents.Common/2.14.0,Windows/10.0.14393 cosmos.netstandard-sdk /3.24.1);.

在本地,我通过以下链接登录 VS https://learn.microsoft.com/en-us/do.net/api/overview/azure/identity-readme?view=azure-do.net#authenticating-via-visual -工作室

有解决 Azure.Identity 问题的想法吗?

参考:

使用托管身份将 Function 应用程序连接到 CosmosDB

https://github.com/Azure/azure-sdk-for.net/tree/Azure.Identity_1.5.0/sdk/identity/Azure.Identity/samples

今天早上我在设置 CosmosDB 以使用我的 Azure VM 的托管身份时遇到了同样的错误。 错误消息指出您的委托人没有 RBAC 权限Microsoft.DocumentDB/databaseAccounts/readMetadata 一旦你给了校长,你就可以使用 Azure 使用该权限身份验证。Identity 应该可以工作。

DocumentDB 帐户参与者没有Microsoft.DocumentDB/databaseAccounts/readMetadata角色,而且我找不到包含该权限的内置 Azure 角色,因此我按照本文中的示例创建了自己的自定义CosmosDBReadWrite角色。

要创建自定义角色定义和分配,您需要安装Azure CLI

配置自定义角色定义

准备 JSON 角色定义文件

首先,您需要创建一个包含角色定义的 json 文件。 这里有 2 个不同的自定义角色配置 json 文件,一个用于对 CosmosDB 的只读访问权限,另一个具有读写角色访问权限。

Json 只读自定义角色文件
{
    "RoleName": "CosmosDBReadOnlyRole",
    "Type": "CustomRole",
    "AssignableScopes": ["/"],
    "Permissions": [{
        "DataActions": [
            "Microsoft.DocumentDB/databaseAccounts/readMetadata",
            "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/read",
            "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/executeQuery",
            "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/readChangeFeed"
        ]
    }]
}
Json 读写自定义角色文件
{
    "RoleName": "CosmosDBReadWriteRole",
    "Type": "CustomRole",
    "AssignableScopes": ["/"],
    "Permissions": [{
        "DataActions": [
            "Microsoft.DocumentDB/databaseAccounts/readMetadata",
            "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*",
            "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*"
        ]
    }]
}

创建和分配角色定义

使用自定义角色定义保存 json 文件后,我们可以使用 Azure CLI 创建自定义角色,然后将其分配给正确的委托人。

使用您在上面创建的 JSON 文件创建您的自定义角色

resourceGroupName='<myResourceGroup>'
accountName='<myCosmosAccount>'
az cosmosdb sql role definition create -a $accountName -g $resourceGroupName -b @role-definition.json

创建角色后,应返回创建的角色的定义。 如果不是,请使用以下命令查找可以在name属性中找到的roleDefinitionId

az cosmosdb sql role definition list --account-name $accountName -g $resourceGroupName

最后,将自定义角色应用于需要访问 CosmosDB 权限的委托人。

resourceGroupName='<myResourceGroup>'
accountName='<myCosmosAccount>'
roleDefinitionId = '<roleDefinitionId>'
principalId = '<ID for the Object that needs access to the CosmosDB>'
az cosmosdb sql role assignment create -a $accountName -g $resourceGroupName -s "/" -p $principalId -d $roleDefinitionId

希望这也能解决您遇到的错误!

暂无
暂无

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

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