我为一个功能应用程序创建了一个托管身份,并通过以下两部分将其分配给DocumentDB Account Contributor
https://docs.microsoft.com/en-us/azure/cosmos-db/managed-identity-based-authentication#assign-a-system-assigned-managed-identity-to-a-function-app
https://docs.microsoft.com/en-us/azure/cosmos-db/managed-identity-based-authentication#grant-access-to-your-azure-cosmos-account
微软蔚蓝色的服务。AppAuthentication验证
当我尝试从下面的部分运行代码时,我得到了一个异常:
https://docs.microsoft.com/en-us/azure/cosmos-db/managed-identity-based-authentication#programmatically-访问azure cosmos db密钥
无法加载文件或程序集的系统。文本编码。Web,版本=6.0.0.0,区域性=中性,PublicKeyToken=CC7B13FFCD2DD51'。系统找不到指定的文件。at系统。文本Json。序列化。元数据。JsonPropertyInfo。系统上的DeterminePropertyName()。文本Json。序列化。元数据。JsonPropertyInfo。GetPolicys(Nullable1 ignoreCondition,Nullable
1 declaringTypeNumberHandling)位于。。。系统运行时。编译器服务。任务等待者。系统上的HandleNonSuccessAndDebuggerNotification(任务任务)。运行时。编译器服务。任务等待者'1。Cosmos的GetResult()。样品。AzureFunctions。AzureFunctionsCosmosClientMI。d\u 7。C中的MoveNext()。ME\MyLab。Code\AzureCode\CosmosDB\azure-cosmos-dotnet-v3-usage\AzureFunctions\AzureFunctionsCosmosClientMI。cs:第85行
蔚蓝色的身份
由于MS不推荐
AppAuthentiation
,因此我切换到使用Azure。身份
通过以下链接:https://docs.microsoft.com/en-us/dotnet/api/overview/azure/identity-readme?view=azure-dotnet
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状态代码For的,子状态代码5301:响应状态代码不表示成功:禁止(403);子状态:5301;ActivityId:xxxx-bf03-4355-8642-5d316f9d3373;原因:(请求被Auth xxxx阻止:请求被阻止,因为主体[xxx-2bff-44e9-97be-9ffeb3aae3ee]没有在资源[/]上执行操作所需的RBAC权限[Microsoft. DocumentDB/数据库帐户/readMetadata]。了解更多:https://aka.ms/cosmos-native-rbac.ActivityId:xxx-bf03-4355-8642-5d316f9d3373,Microsoft. Azure. Documents. Common/2.14.0, Windows/10.0.14393 cosmos-netardardal-sdk/3.24.1);。
在本地,我按照链接登录到VShttps://docs.microsoft.com/en-us/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#authenticating-via-visual-studio
任何解决Azure问题的想法。身份
参考:
使用托管身份将功能应用程序连接到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/数据库帐户/readMetadata。授予主体后,您将使用该权限使用Azure进行身份验证。身份应该有效。
DocumentDB帐户参与者没有Microsoft角色。DocumentDB/databaseAccounts/readMetadata,我找不到包含该权限的内置Azure角色,因此我按照本文中的示例创建了自己的自定义CosmosDBReadWrite角色。
若要创建自定义角色定义和分配,需要安装Azure CLI。
首先,您需要创建一个带有角色定义的json文件。这里有两个不同的自定义角色配置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
创建角色后,应返回所创建角色的定义。如果没有,请使用以下命令查找roleDefinitionId,该ID可以在name属性中找到。
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
希望这也解决了您遇到的错误!
我有一个在Azure VM中托管的php应用程序,在密钥库中有一些秘密。我已经设置了托管身份并获得了进入保险库的权限。 Azure SDK for php不支持密钥库,所以我使用REST接口。 我的问题是当在本地运行时,即我的代码在桌面上以VSCode运行时,我不能调用AIMS来获取令牌,因为我在本地机器上没有托管标识。 我只能想到两个选择: null 请注意,Visual Studio提供了Az
我在Azure中有一个应用程序服务使用连接字符串连接到Azure Cosmos Mongo API。我想知道是否有一种方法可以使用托管身份连接到Mongo API,而不是使用连接字符串。我知道这对于Cosmos SQL API是可行的,但是找不到任何关于Mongo API的信息。 谢谢你
我试图通过ARM模板将Service Bus Receiver角色添加到用户分配的托管标识中。 i、 e.这一作用。https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#azure-服务总线数据接收器 这是模板 它返回这个错误。 状态消息:不允许更新租户ID、应用程序ID、主体ID和作用域。(
我正在尝试在Function App中编写一个函数来操作CosmosDB中的数据。如果我在环境变量中删除读写键,它就会工作。为了使它更健壮,我希望它作为托管标识应用程序工作。该应用程序在Cosmos DB上具有“DocumentDB帐户贡献者”角色。 但是,CosmosClient构造函数不接受凭据,需要读写密钥。我一直在追查azure的兔子洞。管理。宇宙数据库。有一个带有list\u keys(
是否使用Azure Active Directory身份验证库(ADAL)管理身份,尤其是对于来自文档[1]的此命令? [1]https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-linux-vm-access-storage
我正在寻求在Azure DevOps中的ARM部署中集成密钥库的最佳方法。 例如,部署一个应用程序服务并创建一个托管服务标识,这样它就可以从密钥库中获取预先存在的数据库的机密。 1)在Azure portal中,我手动为App服务创建了一个新的服务主体,在访问策略中使用“get”和“list”权限。 2)在我的DevOps项目中,在项目设置下,我创建了一个服务连接。 3)我已经在DevOps中创建