azure - 设置 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 是否有其他问题,因为我的应用程序不仅在本地调试时不会获得机密,而且在部署在密钥保管库所在的同一台机器上时也不会获得机密上。这是一个非常令人困惑的问题。
解决方案
您可以使用下面的代码并向您的应用程序添加权限。
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# 代码示例。
推荐阅读
- windows - docker-compose 3.8 中的 network_mode 主机(再次)不工作(在 Windows 中)
- twilio - Twilio 在表单提交时呼叫多个代理
- javascript - Ant Design 选择标签无数据重命名
- sql - 突触顶级父层次结构
- php - Myqsl 警告:mysqli_connect(): (HY000/2002): No such file or directory in
- swagger - Swagger 页面上的“显示/隐藏”“列表操作”和“扩展操作”
- firebase - Firebase 身份验证:我应该更喜欢哪种身份验证?
- c++ - 通过 ssh 使用 gdbserver 进行远程调试失败,远程连接关闭
- python - 为什么在安装 daphne 时出现此错误?
- android - CoordinatorLayout.IndexOutOfBoundsException 的原因是什么?