我已经使用 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 进行身份管理是一团糟 :(