对Azure Key Vault进行MSI身份验证无法在VS 2017和IISExpress上本地运行

时间:2018-09-24 15:36:13

标签: azure iis-express azure-keyvault azure-authentication

我已经使用Azure Key Vault实现了用于加密密钥的解决方案。我已遵循https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity文档的建议,以了解如何使用托管服务身份向Azure Key Vault验证我的App Service。我的应用程序服务是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)(即 something @ 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进行身份验证来部署解决方案,因此我们不必创建充当App Service与Key Vault之间中介的Active Directory应用程序。我们最终不得不将App ID和App Secret放入我们的应用程序服务配置中,而使用MSI,我们避免了必须管理敏感数据的这两个额外位。

提前感谢您的任何建议。

更新

我已经确认,如果我使用的是与我的公司AAD帐户关联的订阅的一部分的密钥保管箱,则来自VS的MSI身份验证将正常工作,没有例外。我的配置一定有问题。是否还有其他人在其Microsoft合作伙伴网络Visual Studio Enterprise Subscription Azure权益中遇到此问题?用MS进行身份管理是一个MesS:(

2 个答案:

答案 0 :(得分:0)

在此步骤上,您可能会错过授予帐户访问权限的机会。请看一下这篇文章,以详细了解-

Use Key Vault from App Service with Managed Service Identity

enter image description here

更新

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

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

enter image description here

答案 1 :(得分:0)

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

检查Visual Studio /工具/选项/ Azure服务身份验证以查看用于在Azure服务中进行身份验证并设置适当的帐户。

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