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 Id 和 App 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 规则中的服务标记的方案