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

Rob*_*Rob 5 c# azure .net-core service-principal azure-keyvault

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

var client = new KeyVaultClient(GetAccessToken);
var secret = client.GetSecretAsync("https://{keyvaultName}.vault.azure.net", "MySecret").Result; 
Run Code Online (Sandbox Code Playgroud)

哪个调用此函数:

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;
}
Run Code Online (Sandbox Code Playgroud)

调用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;
}
Run Code Online (Sandbox Code Playgroud)

我通过转到“ Azure”>“ AAD”>“应用程序注册 ”来设置服务原则,并在设置该原则时记下了应用程序ID和密码(应用程序密码)。

然后,在KeyVault中,我将原理添加到了访问控制(IAM)中,并拥有贡献者权限,但仍然不满意!

有人遇到过这种情况吗?

谢谢!:)

Joe*_*Cai 7

我用下面的代码测试它,它在我这边工作正常。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;
}
Run Code Online (Sandbox Code Playgroud)

此外,您需要使用“Key Vault”向注册的应用程序添加权限。 在此处输入图片说明

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

输出如下:在此处输入图片说明