使用客户端密码检索 Azure KeyVault 密码

Retrieve Azure KeyVault secret using client secret

我正在试验各种 Azure 功能,目前想从 KeyVault 检索机密。

直接进入案例:

我正在使用 this nuget 包与我的 azure 资源进行交互。

我开发了一个简单的 .NET Core 控制台应用程序并运行它在本地。

我有一个 KeyVault 资源,其中定义了一个密钥,该密钥处于活动状态且未过期。

我已经在 AAD 中注册了一个应用程序,所以我本地发布的 .NET Core 控制台应用程序在 AAD 中有一个身份。

比起我在 AAD 中的这个注册应用程序中创建了一个 "client secret" 来使用它来验证我自己作为应用程序的身份。

之后,我在我的 KeyVault 资源中添加了访问策略,以允许对这个已注册应用程序的机密进行 GET 操作:

然后我开发了一小段代码来检索所需的秘密:

public class AzureAuthentication
{
    public async Task<string> GetAdminPasswordFromKeyVault()
    {
        const string clientId = "--my-client-id--";
        const string tenantId = "--my-tenant-id--";
        const string clientSecret = "--my-client-secret--";
        var credentials = new ClientSecretCredential(tenantId, clientId, clientSecret);
        var client = new SecretClient(new Uri("https://mykeyvaultresource.vault.azure.net"), credentials);
        var secret = await client.GetSecretAsync("admincreds");
        return secret.Value.Value;
    }
}

但是,当我尝试执行此操作时,出现了 AccessDenied 错误:

我是否遗漏了一些非常明显的东西?或者应用 KeyVault 资源中访问策略屏幕的更改时存在一些延迟(此时 >30 分钟)?

确保您的 AD 应用程序(服务主体)在您的密钥库中具有正确的权限 -> Access policies

我测试了你的代码和 Get 许可,它工作正常。

从您的屏幕截图来看,您似乎没有将与 AD 应用程序相关的正确服务主体添加到 Access policies

如果添加与AD App相关的服务主体,它将显示为APPLICATION,而不是COMPOUND IDENTITY

所以在添加的时候,可以直接搜索client Id(i.e. application Id)或者the name of your App Registration,确保添加正确。