【发布时间】:2019-02-28 04:04:38
【问题描述】:
我已经使用 Azure Key Vault 为加密密钥实施了一个解决方案。我已遵循 https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity 上的文档中关于如何使用托管服务标识向 Azure Key Vault 验证我的应用服务的建议。我的应用服务是一个 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 进行身份验证的解决方案,这样我们就不必创建充当应用服务和 Key Vault 之间中介的 Active Directory 应用程序。我们最终不得不将 App ID 和 App Secret 放入我们的应用服务配置中,并且使用 MSI,我们避免了管理这两个额外的敏感数据位。
提前感谢您的任何建议。
更新
我已确认,如果我使用作为与我的公司 AAD 帐户关联的订阅的一部分的 Key Vault,则来自 VS 的 MSI 身份验证正常工作,无一例外。我的配置一定有问题。是否还有其他人对其 Microsoft 合作伙伴网络 Visual Studio 企业订阅 Azure 权益有此问题?使用 MS 进行身份管理是一团糟 :(
【问题讨论】:
-
你在工具->选项->Azure服务认证中配置了账号吗?
-
@juunas 是的,我在那里为每个帐户配置了不同的结果。如果我使用我的公司帐户,我会收到“未经授权”异常消息,使用我的 MSA 帐户我会收到“禁止”异常消息。我猜这与这两个不同的帐户有关,但我似乎无法弄清楚到底是什么问题。
-
您也可以尝试将租户id指定给GetAccessTokenAsync。
标签: azure iis-express azure-keyvault azure-authentication