无法从 Azure Data Lake Analytics 访问 Azure Key Vault

Cannot access Azure Key Vault from Azure Data Lake Analytics

我有一个带有自定义提取器的 U-SQL 脚本,它访问 Azure Key Vault 以获取一些凭据。

我关注了this tutorial。我有等效的代码从 AD 获取令牌,然后调用提供的 URI 获取实际凭据:

public static async Task<string> GetToken(string authority, string resource, string scope)
{
    var authContext = new AuthenticationContext(authority);
    var clientCred = new ClientCredential(applicationId, authenticationKey);
    AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCred);
    if (result == null)
    {
        throw new InvalidOperationException("Failed to obtain the AD token");
    }
    return result.AccessToken;
}

public static async Task<string> GetSecret(string secretUri)
{
    var keyVaultClient = new KeyVaultClient(
            new KeyVaultClient.AuthenticationCallback(GetToken)
    );
    var sec = await keyVaultClient.GetSecretAsync(secretUri);
    return sec.Value;
}

我的凭据已成功放入保险库,我有一个 URI 来访问它们 - 类似于:

https://my-key-vault-name.vault.azure.net:443/secrets/MyCredentialsName/123abc

我已经在 Azure AD 中注册了我的应用程序并获得了 application-id 和 authentication-key,并且我允许我的应用程序从 Key Vault 中读取机密。在我的 U-SQL 脚本中,我引用了所有需要的程序集。

当我 运行 我的脚本在本地时一切正常(这意味着从本地机器到 AD 和 Key Vault 的连接都可以),但是当我提交它在远程 Data Lake Analytics 帐户上执行时我得到了以下错误:

The remote name could not be resolved: 'my-key-vault-name.vault.azure.net'

at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)

我对 Azure 资源组的管理权限有限,但我可以访问 Data Lake Analytics 上的防火墙选项卡 blade - 我试过启用和禁用防火墙,切换 on/off Allow access to Azure services, 错误依旧。

作为依赖项,我引用了 Microsoft.Azure.KeyVault 2.0.6Microsoft.Azure.KeyVaultWebKey 2.0.4Microsoft.IdentityModel.Clients.ActiveDirectory 3.13.9

关于如何尝试解决它的任何想法?

U-SQL ADLA 中的代码 运行ning 不允许您连接到 container/VM 之外的资源。原因是:

U-SQL 的自定义代码调用可能会扩展到 100 到 1000 多个容器,为数百万行调用数百万个容器。这很容易导致(希望是意外的)针对您尝试访问的服务的分布式拒绝服务附加,从而可能导致对服务进行 DDOS 攻击并阻止 Azure IP 范围。

本地 运行 当前 运行 不在容器中,因此没有此类限制实施。

你想通过这次通话达到什么目的?请注意,存储中的数据已经可以使用 Azure Key Vault 进行透明编码。