【问题标题】:MSI authentication to Azure Key Vault not working locally with VS 2017 and IISExpressAzure Key Vault 的 MSI 身份验证无法在本地使用 VS 2017 和 IISExpress
【发布时间】: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


【解决方案1】:

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

Use Key Vault from App Service with Managed Service Identity

更新

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

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

【讨论】:

  • 感谢您的建议。我的身份已经配置了“秘密管理”的权限。不幸的是,按照您提供的步骤操作并没有成功。
  • 是的,他的帐户至少应该有权访问密钥管理操作下的“获取”权限。因为我看到“在 Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetKeyAsync(IKeyVaultClient 操作.... )" 在堆栈跟踪中提到。您可能还需要其他与​​密钥相关的权限,具体取决于代码的具体用途。
  • @RohitSaigal 我已授予我的 AAD 帐户所有密钥管理权限,但我仍然收到“未经授权”异常消息。
  • @Steve 有两件事要考虑.. 1. 确保您根据密钥库的访问策略授予您提到的两个帐户的密钥、机密等权限。您的公司和hotmail 之一。似乎有些混淆实际上正在使用哪个。 2.获取“var token = await tokenProvider.GetAccessTokenAsync(resource);”末尾的实际token值。然后,我们可以使用 jwt.io 或 jwt.ms 等网站查看令牌中的确切声明
  • @RohitSaigal 很棒的建议......我会在完成这些测试后报告结果。感谢您的帮助。
【解决方案2】:

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

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

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

【讨论】:

  • 在尝试了 10 多个解决方案并浪费了 4 个多小时之后,这就是解决我的问题的原因。荣誉
猜你喜欢
  • 2020-08-21
  • 2020-07-22
  • 2019-03-13
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多