在执行Get-AzureKeyVaultSecret时,服务主体未经授权

时间:2017-11-23 11:42:58

标签: powershell azure azure-resource-manager azure-powershell azure-keyvault

所以这很奇怪。我创建了一个KeyVault。我已将服务主体添加到该KV的访问策略中,为其提供所有权限。

我从VSTS运行我的基础架构版本。它有一个步骤,它运行cmdlet Get-AzureKeyVaultSecret以获取KV的秘密。此步骤已设置服务主体连接并且可以正常工作。

我昨天跑了这个,它工作得很好。我需要再次运行基础架构,因为我已经对ARM模板进行了更改。但当它到达Get-AzureKeyVaultSecret部分时,它失败了,我收到了这个错误:

  

Microsoft.Azure.KeyVault.Models.KeyVaultErrorException:Operation   返回了无效的状态代码“未授权”

这没有任何意义。这个完全相同的服务主体之前已经这样做了。什么也没有变。该应用程序仍然在KV的访问策略中。 VSTS的连接仍然有效。

发生了什么事?

2 个答案:

答案 0 :(得分:0)

您使用的是Azure AD吗?您可以使用以下内容获取应用程序:

$application = Get-AzureRmADApplication | ? { $_.DisplayName -match "xxx" }
Get-AzureRmADServicePrincipal | ? { $_.DisplayName -match "xxx" }
Get-AzureRmADAppCredential -ApplicationId $application.ApplicationId

这应该确定应用程序是否设置正确且主体的凭证是否未过期等。

那看起来不错,那么你需要检查密钥保管库的权限是否分配给主体(而不是应用程序)的ObjectId。

如果这也是正确的,那么代码可能会在您认为的凭据下运行时出现问题。您可以尝试打开密钥保管库的日志记录(在Azure门户中的诊断日志下),这应该可以为您提供有关正在进行的操作的信息。

答案 1 :(得分:0)

正如Dainel所说,您应该检查您的用户的对象ID是否正确。它与SO上的这个question类似。

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

enter image description here

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

Get-AzureADServicePrincipal