singleton - 带有 AdlsClient : Access token expired 的 Azure MSI

标签 singleton azure-data-lake azure-managed-identity

我正在使用 Azure 托管服务标识 (MSI) 创建静态(单例)AdlsClient。

然后,我在 Functions 应用程序中使用 AdlsClient 写入数据湖存储。

该应用程序可以正常工作大约一天,但随后停止工作,我看到此错误。

The access token in the 'Authorization' header is expired.”

Operation: CREATE failed with HttpStatus:Unauthorized Error

显然,MSI token 每天都会在没有警告的情况下过期。

不幸的是,MSI token 提供程序不会与 token 一起返回到期日期,因此,我无法检查 token 是否仍然有效。

处理这个问题的正确方法是什么?任何帮助表示赞赏。

这是我的代码。
public static class AzureDataLakeUploaderClient
{
    private static Lazy<AdlsClient> lazyClient = new Lazy<AdlsClient>(InitializeADLSClientAsync);

    public static AdlsClient AzureDataLakeClient => lazyClient.Value;

    private static AdlsClient InitializeADLSClientAsync()
    {

        var azureServiceTokenProvider = new AzureServiceTokenProvider();
        string accessToken = azureServiceTokenProvider.GetAccessTokenAsync("https://datalake.azure.net/").Result;
        var client = AdlsClient.CreateClient(GetAzureDataLakeConnectionString(), "Bearer " + accessToken);
        return client;
    }
}

谢谢!

最佳答案

GetAccessTokenAsync 返回的访问 token 保证在接下来的 5 分钟内不会过期。默认情况下,Azure AD 访问 token 会在一小时内过期 [1]。

因此,如果您使用相同的 token (默认过期时间)超过一个小时,您将收到“过期 token ”错误消息。每次需要使用 AdlsClient 时,请使用从 GetAccessTokenAsync 获取的 token 初始化 AdlsClient。 GetAccessTokenAsync 将访问 token 缓存在内存中,如果在 5 分钟内到期,将自动获取新 token 。

惰性对象总是返回用 [2] 初始化的相同对象。因此, AdlsClient 继续使用旧 token 。

引用

[1] https://docs.microsoft.com/en-us/azure/active-directory/active-directory-configurable-token-lifetimes#token-types

[2] https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization#basic-lazy-initialization

关于singleton - 带有 AdlsClient : Access token expired 的 Azure MSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51866058/

相关文章:

c# - 在 C# 中访问 Azure 中系统管理标识的应用程序 ID

python - 尝试使用 MSI 身份验证从 Azure ML 服务连接 Azure SQL 数据库(无需用户名和密码即可连接 Azure 数据库)

azure - DataLake 锁定同一文件的读写

singleton - 如何让 Rust 单例的析构函数运行?

android - 在所有 Activity 中访问 GoogleApiClient 对象

c++ - 如何将抽象类变成单例对象?

azure-data-lake - 是否可以从 Azure Data Lake Analytics 中删除已完成的作业?

java - Spark 上下文 WholeTextFiles 和 JavaStreamingContext textFileStream 在 Apache Spark 集群中不起作用

azure-managed-identity - 使用应用服务和 Azure SQL 的用户分配身份是否有效?

extjs - ExtJs4 中的单例