webapp而非应用程序服务主体上的Azure keyvault访问策略

webapp而非应用程序服务主体上的Azure keyvault访问策略,azure,azure-active-directory,azure-web-app-service,azure-keyvault,Azure,Azure Active Directory,Azure Web App Service,Azure Keyvault,我在Azure WebApp中托管了一个WebApi。我已经在Azure广告中创建了应用程序注册 WebApi连接字符串存储在Azure Keyvault中。我不明白的是,在Keyvault访问策略中,我必须授予对WebApp的访问权(获取并列出机密),而不是授予对Azure AD中创建的应用程序服务主体的访问权。 否则它将无法工作,WebApi在尝试连接到KeyVault时将无法以403开头 但通常应该将访问权限授予用户或服务主体,而不是Web应用程序。这是正确的吗?我相信您所指的是,如果是这

我在Azure WebApp中托管了一个WebApi。我已经在Azure广告中创建了应用程序注册

WebApi连接字符串存储在Azure Keyvault中。我不明白的是,在Keyvault访问策略中,我必须授予对WebApp的访问权(获取并列出机密),而不是授予对Azure AD中创建的应用程序服务主体的访问权。 否则它将无法工作,WebApi在尝试连接到KeyVault时将无法以403开头


但通常应该将访问权限授予用户或服务主体,而不是Web应用程序。这是正确的吗?

我相信您所指的是,如果是这种情况,那么最好的做法是通过服务主体访问Web应用程序的标识,因为没有要交换的密码,并且该标识在应用程序的生命周期内存在

幕后的托管身份使用指纹来识别应用程序就是它所说的那个人

如果将访问策略分配给Azure Key Vault,则需要更新访问策略,并且可以通过以下ARM进行分配:

"objectId": "[reference(resourceId('Microsoft.Web/sites', INSERT APP SERVICE NAME), '2018-02-01', 'Full').identity.principalId]"
一个重要的提示是,如果通过相同的ARM模板创建应用程序服务和密钥库,则根据应用程序服务的不同,密钥库将需要dependsOn。不希望为尚未创建的ID创建访问策略

如果通过ARM分配托管标识和RBAC角色,这里有一个解决方案说明如何将应用程序服务(Azure内置贡献者角色)分配给特定的存储帐户。在变量部分中,定义角色名称和:

然后,这将在ARM模板中指定:

{
  "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
  "apiVersion": "2018-09-01-preview",
  "name": "[concat(variables('storageName'), '/Microsoft.Authorization/',  guid(uniqueString(variables('storageName'),variables('Reader').RoleName,parameters('principalId'))))]",
  "properties": {
    "roleDefinitionId": "[variables('Contributor').RoleID]",
    "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('webSiteName')), '2018-02-01', 'Full').identity.principalId]"
  }
}
如果通过相同的ARM模板构建/分配,请再次确保正确识别依赖项


如果使用插槽,每个插槽都有自己的托管标识,该标识将保留在插槽中。因此插槽A将始终作为插槽A设置访问权限,并且在插槽切换时不会进行交换。

是的,您是正确的,我使用托管标识。那么只有一个问题:你说这个身份在应用程序的生命周期中一直存在。但如果我删除应用程序并重新部署它,它还能工作吗?我的意思是objectId在第二次部署后可能会有所不同,它应该会中断,对吗?它仍然可以工作。我发现的唯一例外是SQL Server。如果已将SQL access设置到该帐户,则需要删除该帐户并从SQL Server/数据库重新加载该帐户。这与SQL Server记录AD对象指纹的方式有关。奇怪。我只是尝试删除我的webapp并再次部署它。托管身份已被删除,我的webapp无法再访问keyvault。文档证实了这一点:系统分配的标识绑定到您的应用程序,如果您的应用程序被删除,该标识将被删除。一个应用程序只能有一个系统分配的标识。我应该使用用户指定的标识并在我的ARM模板中进行设置吗?它是否列在您的密钥库访问策略中?如果您删除了该对象,它将从所有内容中删除。是的,它将列出,但在我删除该应用后,它已从keyvault策略中删除。这就是我在上面问题中的意思。删除webapp后,托管标识在被引用的位置将不再工作。
{
  "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
  "apiVersion": "2018-09-01-preview",
  "name": "[concat(variables('storageName'), '/Microsoft.Authorization/',  guid(uniqueString(variables('storageName'),variables('Reader').RoleName,parameters('principalId'))))]",
  "properties": {
    "roleDefinitionId": "[variables('Contributor').RoleID]",
    "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('webSiteName')), '2018-02-01', 'Full').identity.principalId]"
  }
}