从 WPF 应用程序 Net Core 3.1 连接到 Azure KeyVault

Connect to Azure KeyVault from WPF app Net Core 3.1

在我当前的 Net Core 3.1 WPF 项目中,我希望用户能够连接到 Azure Key Vault。 我设置了一个密钥保管库,其中设置了一些访问策略或用户。

在文档中,我阅读了很多关于使用 SecretClient(new Uri(_keyVaultUrl), new DefaultAzureCredential()); 设置与环境变量的密钥保管库的连接。我不明白的是环境变量在这里有什么用处,因为它们仅限于设置它们的一台机器。 上面的代码returns我的代码中出现一个空对象错误:

Azure.Identity.CredentialUnavailableException: 'DefaultAzureCredential failed to retrieve a token from the included credentials.
- EnvironmentCredential authentication unavailable. Environment variables are not fully configured.
- ManagedIdentityCredential authentication unavailable. The requested identity has not been assigned to this resource.
Status: 400 (Bad Request)

有没有一种直接的方法可以让我使用客户端密码、应用程序 ID,然后使用 Azure 身份库连接到 Azure Key Vault 并进行身份验证?

首先,设置环境变量是为了Azure.Identity用来创建DefaultAzureCredential()。所以你需要设置它们。

如果您的应用程序托管在 Azure 上,您可以通过 DefaultAzureCredential 轻松使用托管身份,按照 this sample and this document.

访问 Azure KeyVault

记得在上面第一个link的第1步中设置访问策略(在Azure中是环境变量) ,它授予你的服务主体/托管标识对 Key Vault 的访问权限。

但是正如您所说,您的应用程序是 WPF,它很可能 运行 在本地(对应于托管在 Azure 上)。在这种情况下,你没有托管标识,但你仍然可以创建服务主体来访问你的 Azure KeyVault。

你可以参考这个文档:Azure Key Vault secret client library for .NET - Version 4.2.0-beta.5.

创建服务主体后,最重要的事情与我之前提到的相同:设置访问策略(您将在这一步中看到环境变量)。您可以像这样在 Powershell 中设置它:

az keyvault set-policy --name <your-key-vault-name> --spn $Env:AZURE_CLIENT_ID --secret-permissions backup delete get list set

然后 create SecretClient 访问 KeyVault:

// Create a new secret client using the default credential from Azure.Identity using environment variables previously set,
// including AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, and AZURE_TENANT_ID.
var client = new SecretClient(vaultUri: new Uri(keyVaultUrl), credential: new DefaultAzureCredential());

// Create a new secret using the secret client.
KeyVaultSecret secret = client.SetSecret("secret-name", "secret-value");

// Retrieve a secret using the secret client.
secret = client.GetSecret("secret-name");