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

Azure - authenticating to KeyVault using Service Principle returns an Unauthorized exception

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

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 returns 一个“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中,我把原理加到Access Control (IAM),有贡献者权限,但还是不开心!

有没有人遇到过这种情况?

谢谢! :)

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

我用下面的代码测试它,它在我这边工作正常。 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 通道中,您需要将策略添加到您注册的应用程序或用户。在访问控制中,您需要为注册的应用程序或用户添加权限。

输出如下: