Azure - 使用服务主体对 Key Vault 进行身份验证返回未经授权的异常

Posted

技术标签:

【中文标题】Azure - 使用服务主体对 Key Vault 进行身份验证返回未经授权的异常【英文标题】:Azure - authenticating to KeyVault using Service Principle returns an Unauthorized exception 【发布时间】:2019-02-03 14:33:04 【问题描述】:

我正在尝试使用服务原则(我有 App IdApp Secret)从 .net Core 控制台应用程序访问 KeyVault。这是我的代码:

var client = new KeyVaultClient(GetAccessToken);
var secret = client.GetSecretAsync("https://keyvaultName.vault.azure.net", "MySecret").Result; 

回调这个函数:

private static async Task<string> GetAccessToken(string authority, string resource, string scope)

    var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
    var credential = new ClientCredential(clientId: appId, clientSecret: appSecret);

    var authResult = await context.AcquireTokenAsync(resource, credential);
    return authResult.AccessToken;

调用 GetSecretAsync 会返回“AccessDenied”异常。修改代码以使用此回调会产生“Unauthorized”异常:

private static async Task<string> GetAccessToken(string authority, string resource, string scope)

    var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
    var credential = new ClientCredential(clientId: appId, clientSecret: appSecret);

    **var authResult = await context.AcquireTokenAsync("https://management.core.windows.net/", credential);**
    return authResult.AccessToken;

我通过转到 Azure > AAD > App Registrations 来设置服务原则,并在设置原则时记下应用程序 ID 和密码(应用程序密钥)。

然后在 KeyVault 中,我将原理添加到访问控制 (IAM) 中,具有贡献者权限,但仍然没有乐趣!

以前有人遇到过这种情况吗?

谢谢! :)

【问题讨论】:

【参考方案1】:

我使用以下代码对其进行了测试,它在我这边可以正常工作。 resourceUri 是https://vault.azure.net

static string appId = "xxxxxxxxxxxxx";
static string appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
static string tenantId = "xxxxxxxxxxxxxxxxxxxxx";
public static void Main(string[] args)

    var kv = new KeyVaultClient(GetAccessToken);
    var scret = kv.GetSecretAsync("https://xxxxxx.vault.azure.net", "secretname").GetAwaiter().GetResult();


public static async Task<string> GetAccessToken(string azureTenantId, string clientId, string redirectUri)

    var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
    var credential = new ClientCredential(appId, appSecret);
    var tokenResult = await context.AcquireTokenAsync("https://vault.azure.net", credential);
   return tokenResult.AccessToken;

另外,您需要向已注册的应用添加“Key Vault”权限。

在 Key Vault 通道中,您需要向已注册的应用程序或用户添加策略。在访问控制中,您需要为注册的应用程序或用户添加权限。

输出如下:

【讨论】:

【参考方案2】:

“访问控制 (IAM)”控制对保管库本身的访问。有一种单独的方法可以控制对保管库内容的访问(即:密钥、机密和证书)。如these docs 中所述,我们可以授权给定的 AAD 应用程序通过导航到所需的保管库,选择“访问策略”,单击“添加新的”,然后搜索您的 Azure 门户中的给定保管库中的机密。服务负责人。您应该能够按应用程序 ID 过滤:

【讨论】:

以上是关于Azure - 使用服务主体对 Key Vault 进行身份验证返回未经授权的异常的主要内容,如果未能解决你的问题,请参考以下文章

Azure DevOps -> Pipelines -> Library -> 访问 Azure Key Vault -> Key Vault 不允许从所有网络访问

如何从 Key Vault 自动映射 Azure Functions 机密

如何使用 Azure Key Vault 中的证书/密钥对使用 Azure Pipelines 构建的代码进行签名?

Azure Key Vault 作为入站 NSG 规则中的服务标记的方案

无法使用应用服务上的 Azure MSI 访问 Key Vault

Azure Key Vault 使用Azure Portal创建和查看Azure Key Vault