2

我已经使用 Azure Key Vault 为加密密钥实施了一个解决方案。我已遵循https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity文档中的建议,了解如何将我的应用服务验证到 Azure Key使用托管服务标识的保管库。我的应用服务是一个 asp.net core 2.1 应用程序。

当我将应用服务发布到我的 Azure 订阅时,这是有效的,因此我确信实现是正确的。问题在于在本地运行代码并尝试使用 MSI 连接到 Azure Key Vault 似乎并不像宣传的那样对我有用。

我正在运行 Visual Studio 2017 版本 15.8.5。我在 Azure Active Directory 中的企业身份是我登录 VS 的方式(即sbraswell@myemployer.com)。但是,我使用的 Azure 订阅是我的 MSDN 合作伙伴权益的一部分,并且与我的 Microsoft 帐户 (MSA)(即@hotmail.com)相关联。我已向我的订阅授予了我的公司 AAD 身份“所有者”角色权限。我能够以我的企业身份登录 Azure 门户并访问与我的 MSA 帐户关联的 Azure 订阅的所有方面。

获取 Azure Key Vault 的访问令牌时,以下代码不会引发异常:

var tokenProvider = new 
Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider();
var token = await tokenProvider.GetAccessTokenAsync(resource);
return token;

当我尝试从保管库解析特定加密密钥时,此代码引发异常:

var keyEncryptionKey = await cloudResolver.ResolveKeyAsync(keyId, CancellationToken.None)

抛出的异常是:

Microsoft.Azure.KeyVault.Models.KeyVaultErrorException: Operation returned an invalid status code 'Unauthorized'
   at Microsoft.Azure.KeyVault.KeyVaultClient.GetKeyWithHttpMessagesAsync(String vaultBaseUrl, String keyName, String keyVersion, Dictionary`2 customHeaders, CancellationToken cancellationToken)
   at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetKeyAsync(IKeyVaultClient operations, String keyIdentifier, CancellationToken cancellationToken)

我希望能够使用 MSI 来部署解决方案以进行身份​​验证,这样我们就不必创建充当应用服务和 Key Vault 之间中介的 Active Directory 应用程序。我们最终不得不将 App ID 和 App Secret 放入我们的应用服务配置中,并且使用 MSI,我们避免了管理这两个额外的敏感数据位。

提前感谢您的任何建议。

更新

我已经确认,如果我使用作为与我的公司 AAD 帐户关联的订阅的一部分的 Key Vault,则来自 VS 的 MSI 身份验证可以正常工作,无一例外。我的配置一定有问题。是否还有其他人对其 Microsoft 合作伙伴网络 Visual Studio 企业订阅 Azure 权益有此问题?使用 MS 进行身份管理是一团糟 :(

4

2 回答 2

4

使用 Azure Key Vault 服务在 Visual Studio 中进行本地开发取决于“Azure 服务身份验证扩展” https://marketplace.visualstudio.com/items?itemName=chrismann.MicrosoftVisualStudioAsalExtension#overview ,该扩展 自 15.6 版起已集成到 Visual Studio 中,并且不要t 需要单独安装。

检查 Visual Studio/Tools/Options/Azure 服务身份验证以查看您使用哪个帐户在 Azure 服务中进行身份验证并进行适当设置。

此外,在应用程序中安装 NuGet 数据包 Microsoft.Azure.Services.AppAuthentication。

于 2018-12-06T08:53:57.210 回答
0

您可能会错过授予帐户访问权限的此步骤。请看这篇文章以了解详细的演练 -

将应用服务中的 Key Vault 与托管服务标识一起使用

在此处输入图像描述

更新

正如下面评论中所讨论的,除了对密钥保管库的秘密管理权限访问之外,请确保您在“密钥管理操作”下至少授予“GET”权限,因为您的错误堆栈跟踪在执行 GetKeyAsync 方法时显示问题。请注意,除了与密钥操作相关的“GET”之外,您可能还需要其他权限,以防您的代码执行其他操作,例如列出密钥或创建、更新、删除等。

at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetKeyAsync(IKeyVaultClient operations, String keyIdentifier, CancellationToken cancellationToken)

在此处输入图像描述

于 2018-09-24T16:34:55.400 回答