使用 "Microsoft.Azure.KeyVault" SDK 的客户端代码如何设法获取 Azure AD 令牌以使用 Azure keyvault 对自身进行身份验证以检索机密?

How client code using "Microsoft.Azure.KeyVault" SDK manages to get Azure AD token to authenticate itself with Azure keyvault to retrieve secret?

下面的代码写在“Microsoft.Azure.KeyVault”SDK 之上,

using Microsoft.Azure.KeyVault;   
public class MyAzKeyVaultclass
{

 private readonly IKeyVaultClient _vaultClient;
 public static ClientAssertionCertificate certAssertion { get; set; }
 public MyAzKeyVaultclass()
    {
        _vaultClient = new KeyVaultClient(GetADTokenAsync);
    }

 private async Task<string> GetADTokenAsync(string authority, string resource, string scope)
    {           
        var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
        var result = await context.AcquireTokenAsync(resource, certAssertion);
        return result.AccessToken;
    }

 public async Task<string> GetSecretValueFromKeyVaultAsync(string name, X509Certificate2 certificate)
    {
     certAssertion = new ClientAssertionCertificate(azureADApplicationId, certificate);            
     var result = await _keyVaultClient.GetSecretAsync(azkeyVaultUrl, name);
     return result.Value;
    }
}

调用 GetSecretValueFromKeyVaultAsync(secretName) returns 秘密值并且工作正常。

但希望有人揭开这段代码的工作原理。

基本上我只提供“azureADApplicationId”和“证书”。无租户、无托管身份或其他详细信息等

此客户端代码 运行 在某些 Azure tenantX 上的某些 Azure VM 上。而 id = 'azureADApplicationId' 的 Azure AD 应用程序属于不同的租户 Y。通过此设置,客户端代码如何仍然设法获取 Azure AD 令牌以使用 keyvault 对自身进行身份验证以检索秘密?这个跨租户call/authorization是如何实现的?

“Microsoft.Azure.KeyVault”SDK 是否在客户端代码 运行 处使用 VM 的 IMDS 在幕后施展魔法?或者它使用“DefaultAzureCredential”class?

P.S:1)AzureADApplication 和 Azure KeyVault 属于同一租户 2)已将 azureADApplicationId 添加到目标 keyvault 访问策略。

  1. 这个应用程序在哪里执行并不重要,因为它是在与密钥在同一个租户中注册的应用程序的上下文中执行的金库。

  2. 您已提供足够的信息来获得令牌:

    • Key Vault 端点
    • 应用程序 ID(类似于用户名,但用于应用程序)
    • 客户端证书(代替密码)
  3. 客户端总是首先调用密钥保管库。如果有一个缓存的访问令牌,它会发送它并且应该取回请求的秘密(或其他对象)。但是,如果未提供访问令牌(或已过期),Key Vault 会使用授权终结点进行响应。请参阅来自 Key Vault 的响应:

  1. 现在应用程序具有获取访问令牌所需的所有部分,因此它向身份验证端点发出请求以执行此操作。

  2. 它将返回的访问令牌存储在内存中,用于当前请求和所有未来请求。

我在我的博客上写过: https://azidentity.azurewebsites.net/post/2019/07/31/key-vault-client-why-am-i-seeing-http-401