Azure Key Vault - 访问被拒绝

时间:2017-09-21 02:35:49

标签: c# azure azure-active-directory azure-keyvault azure-resource-manager

我正在创建一个Azure Key Vault。我使用下面的ARM JSON模板。我在Azure AD中创建了一个应用程序,我正在尝试为该应用程序授予所有权限,以便我可以使用此Apps凭据从Key Vault客户端连接到Key Vault。

我正在使用TFS,并创建了“Azure部署:创建或更新资源组”版本定义任务以自动执行此操作。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
  "parameters": {
    "vaults_qnvaultdev_name": {      
      "type": "string"
    },
    "vaults_location": {     
      "type": "string"
    },
    "vaults_skufamily": {      
      "type": "string"
    },
    "vaults_skuname": {
      "type": "string"
    },
    "vaults_tenantid": {
      "type": "string"
    },
    "vaults_objectid": {
      "type": "string"
    }
  },
    "variables": {},
    "resources": [
      {
        "comments": "Generalized from resource: '/subscriptions/subscription().subscriptionId/resourceGroups/resourceGroup().name/providers/Microsoft.KeyVault/vaults/[parameters('vaults_qnvaultdev_name')]'.",
        "type": "Microsoft.KeyVault/vaults",
        "name": "[parameters('vaults_qnvaultdev_name')]",
        "apiVersion": "2015-06-01",
        "location": "[parameters('vaults_location')]",
        "tags": {},
        "scale": null,
        "properties": {
          "sku": {
            "family": "[parameters('vaults_skufamily')]",
            "name": "[parameters('vaults_skuname')]"
          },
          "tenantId": "[parameters('vaults_tenantid')]",
          "accessPolicies": [
            {
              "tenantId": "[parameters('vaults_tenantid')]",
              "objectId": "[parameters('vaults_objectid')]",
              "permissions": {
                "keys": [
                  "All",
                  "Get",
                  "List",
                  "Update",
                  "Create",
                  "Import",
                  "Delete",
                  "Recover",
                  "Backup",
                  "Restore"
                ],
                "secrets": [
                  "All",
                  "Get",
                  "List",
                  "Set",
                  "Delete",
                  "Recover",
                  "Backup",
                  "Restore"
                ]
              }
            }
          ],
          "enabledForDeployment": true
        },
        "dependsOn": []
      }
    ]
}

模板执行正常,并且正在创建密钥保管库。我还可以在保险库的访问策略中看到,Principal正在添加所有权限。但是,在创建保管库后,当我使用Principal的客户端ID和密码从客户端应用程序进行连接时,我收到“拒绝访问”错误。

我注意到,如果我通过门户网站并通过密钥保管库的访问策略手动添加应用程序,则Vault客户端可以成功进行身份验证。我在这里错过了什么吗?

更新:问题已修复 我手动将应用程序权限授予了Vault的访问策略,并检查了资源门户。然后我看到资源门户中生成的此应用程序的“对象ID”与我在Azure AD中看到的不同 - 在此应用程序的门户中。任何想法为什么这些不同?

2 个答案:

答案 0 :(得分:1)

请参阅此link

  

objectId string是用户,服务主体或的对象ID   保管库的Azure Active Directory租户中的安全组。该   对象ID对于访问策略列表必须是唯一的。

您可以在Enterprise applications - All applications而非App registrations找到对象ID。

enter image description here

您还可以使用Power Shell获取对象ID。

Get-AzureADServicePrincipal

根本原因是,在Azure门户中注册Azure AD应用程序时,Azure AD租户中会创建两个对象:应用程序对象和服务主体对象。

  

申请对象

     

Azure AD应用程序由其唯一的应用程序定义   对象,驻留在应用程序所在的Azure AD租户中   注册,被称为申请"家庭"承租人。 Azure AD   图形应用程序实体定义应用程序的模式   对象的属性。

     

服务主体

     

服务主体对象定义了策略和权限   应用程序在特定租户中的使用,为a。提供基础   安全主体在运行时表示应用程序。 Azure   AD Graph ServicePrincipal实体定义服务的架构   主要对象的属性。

有关此问题的详情,请参阅此link

答案 1 :(得分:0)

如果您想通过ARM实现所有这些功能,请参考how to add Access Policies to MSI via ARM上的答案。

此过程比应用程序注册容易一些,因为应用程序本身将具有注册的身份。您可以在Managed Service Identities

上阅读更多内容