Azure-使用服务原理向KeyVault进行身份验证会返回未经授权的异常

时间:2018-08-28 21:50:43

标签: c# azure .net-core azure-keyvault service-principal

我正在尝试使用服务原理(我有 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 ”异常。修改代码以使用此回调会产生“ 未授权”异常:

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>应用程序注册设置服务原则,并在设置该原则时记下了应用程序ID和密码(应用程序机密)。

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

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

谢谢! :)

2 个答案:

答案 0 :(得分:3)

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

enter image description here enter image description here

答案 1 :(得分:3)

我用以下代码对其进行了测试,它可以正常工作。 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”向已注册的应用添加权限。 enter image description here

在“密钥保险库”通道中,您需要向已注册的应用程序或用户添加策略。并且在访问控制中,您需要向已注册的应用程序或用户添加权限。 enter image description here enter image description here

输出如下:enter image description here