![](/img/trans.png)
[英]Access CosmosDB Data from Azure App Service by using managed identity (Failed)
[英]Connect Azure CosmosDB using Managed Identities from Azure Function App both locally and on Azure
我为 Function 应用程序创建了一个托管身份,并按照以下两个部分将其分配给DocumentDB Account Contributor
Microsoft.Azure.Services.AppAuthentication
当我尝试运行以下部分的代码时出现异常:
无法加载文件或程序集“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.Identity
: https://learn.microsoft.com/en-us/do.net/api/overview/azure/identity-readme?查看=azure-do.net
和下面的代码
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 问题的想法吗?
参考:
今天早上我在设置 CosmosDB 以使用我的 Azure VM 的托管身份时遇到了同样的错误。 错误消息指出您的委托人没有 RBAC 权限Microsoft.DocumentDB/databaseAccounts/readMetadata 。 一旦你给了校长,你就可以使用 Azure 使用该权限身份验证。Identity 应该可以工作。
DocumentDB 帐户参与者没有Microsoft.DocumentDB/databaseAccounts/readMetadata角色,而且我找不到包含该权限的内置 Azure 角色,因此我按照本文中的示例创建了自己的自定义CosmosDBReadWrite角色。
要创建自定义角色定义和分配,您需要安装Azure CLI 。
首先,您需要创建一个包含角色定义的 json 文件。 这里有 2 个不同的自定义角色配置 json 文件,一个用于对 CosmosDB 的只读访问权限,另一个具有读写角色访问权限。
{
"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"
]
}]
}
{
"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.