首页 > 解决方案 > 设置 Azure Key Vault

问题描述

几天来,我一直在努力在我的应用程序的开发和生产版本中使用 Azure Key Vault。在 VS 2017 中调试期间或在 Azure 上部署为 Web 应用程序时,我似乎无法正确设置以从本地运行的应用程序访问我的密钥保管库。当我将 CLI 与我的帐户和资源组集一起使用时,我可以毫无问题地访问我的保管库中的机密。但是,当我尝试在我的应用程序中使用以下代码访问相同的秘密时,我收到一条错误消息,指出未获得访问令牌(释义)。

Imports System.Threading.Tasks
Imports Microsoft.Azure.KeyVault
Imports Microsoft.Azure.KeyVault.Models
Imports Microsoft.Azure.Services.AppAuthentication
Imports Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider

Public Class SocialXXXXXXX
    Inherits System.Web.UI.Page

    Public Property Message As String

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'Message = "Your application description page."
        Dim retries As Integer = 0
        Dim retry As Boolean = False

        Try
            Dim azureServiceTokenProvider As AzureServiceTokenProvider = New AzureServiceTokenProvider()

            Dim keyVaultClient As KeyVaultClient = New KeyVaultClient(New KeyVaultClient.AuthenticationCallback(AddressOf GetAccessTokenAsync))
            Dim secret = keyVaultClient.GetSecretAsync("https://XXXXXXXvault.vault.azure.net/secrets/ExamplePassword/52ec77ddc2dXXXXXXX6c63f6c9").Result
            TextBox7.Text = secret.Value
        Catch keyVaultException As KeyVaultErrorException
            TextBox7.Text = keyVaultException.Message
        End Try



    End Sub

    Private Shared Function getWaitTime(ByVal retryCount As Integer) As Long
        Dim waitTime As Long = (CLng(Math.Pow(2, retryCount)) * 100L)
        Return waitTime
    End Function

    Public Async Function GetAccessTokenAsync() As Task(Of String)
        Dim azureServiceTokenProvider = New AzureServiceTokenProvider()
        Dim accessToken As String = Await azureServiceTokenProvider.GetAccessTokenAsync("https://XXXXXXXvault.vault.azure.net/")
        Return accessToken
    End Function

我希望能够在开发和生产期间访问我的秘密。

更新:https://forums.asp.net/p/2158070/6271824.aspx?p=True&t=636995498339724660的另一位用户提出了与下面的@Joyey Cai 类似的方法。但是,我不愿意走这条路,因为不是使用 MSI,而是要求我在我的代码或设置中包含我的应用程序密码。我已经阅读了您的许多教程,甚至从 Azure 中删除了除我的 Web 应用程序之外的所有内容,并重新开始关注https://docs.microsoft.com/en-us/learn/modules/manage-secrets-with-azure上的 MS 教程-key-vault/1-介绍并逐字遵循微软的建议(实际上是两次),但仍然没有运气。我还发现其他人也有同样的问题,到目前为止我还没有发现有人解决了这个问题。问题似乎在于 Microsoft.Azure.Services.AppAuthentication 没有对开发人员用于 Azure 服务身份验证的帐户进行身份验证(VS 中的工具>Azure>Azure 服务身份验证)。我也不确定 Microsoft.Azure.Services.AppAuthentication 是否有其他问题,因为我的应用程序不仅在本地调试时不会获得机密,而且在部署在密钥保管库所在的同一台机器上时也不会获得机密上。这是一个非常令人困惑的问题。

标签: azureazure-active-directoryazure-keyvault

解决方案


您可以使用下面的代码并向您的应用程序添加权限。

Imports Microsoft.Azure.KeyVault
Imports Microsoft.IdentityModel.Clients.ActiveDirectory

Public Class Class1
    Shared appId As String = "xxxxxxxxxxxxxxx"
    Shared appSecret As String = "xxxxxxxxxxxxxxx"
    Shared tenantId As String = "xxxxxxxxxxxxxxx"

    Public Shared Sub Main()
        Dim kv = New KeyVaultClient(AddressOf GetAccessToken)
        Dim scret = kv.GetSecretAsync("https://yourkeyvaultname.vault.azure.net", "yoursecretname").GetAwaiter().GetResult().Value
    End Sub

    Public Shared Async Function GetAccessToken(ByVal azureTenantId As String, ByVal clientId As String, ByVal redirectUri As String) As Task(Of String)
        Dim context = New AuthenticationContext("https://login.windows.net/" & tenantId)
        Dim credential = New ClientCredential(appId, appSecret)
        Dim tokenResult = Await context.AcquireTokenAsync("https://vault.azure.net", credential)
        Return tokenResult.AccessToken
    End Function
End Class

此外,您需要向注册的应用程序添加“Key Vault”权限。 在此处输入图像描述

在 Key Vault 通道中,您需要向注册的应用程序或用户添加策略。在访问控制中,您需要为注册的应用程序或用户添加权限。 在此处输入图像描述 在此处输入图像描述

结果:

在此处输入图像描述

这是您可以参考的 C# 代码示例。


推荐阅读