ConfidentialClientApplication.AcquireTokenForClient().ExecuteAsync() 线程安全吗?

Aqu*_*nds 4 c# .net-core azure-ad-msal asp.net-core-2.2

对于使用 MSAL.NET v4 (nuget Microsoft.Identity.Client v4.3.0) 在 .net core 中使用应用程序的承载令牌(客户端 id 和秘密无用户上下文)进行身份验证的ConfidentialClientApplication.AcquireTokenForClient().ExecuteAsync()服务在单例注册服务中使用是安全的像这样实施?

public class AADConfidentialClient : IServiceApiAuthorizer
    {
        private readonly IConfidentialClientApplication _confidentialClient;
        public AADConfidentialClient(IOptions<ConfidentialClientApplicationOptions> options)
        {
            _confidentialClient = ConfidentialClientApplicationBuilder
                     .CreateWithApplicationOptions(options.Value)
                     .Build();
        }

        public async Task<string> GetTokenAsync(IReadOnlyCollection<string> scopes)
        {
            var result = await _confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();

            return result.AccessToken;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在 .net core 内置 DI 注册为

services.AddSingleton<IServiceApiAuthorizer, AADConfidentialClient>();
Run Code Online (Sandbox Code Playgroud)

我已经看到了 ADAL.NET /sf/answers/3721429211/ 的这个答案,其中提到致力于 MSAL v2+ 的线程安全,但没有找到任何确认是否已经完成的内容。

Aqu*_*nds 5

对于client credentials flowthis 用途,成为单身人士是安全的。我最终在 GitHub 问题https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/issues/1342 中找到了这个问题,它是关于on behalf of flow其中一个问题的答案:

每个令牌缓存都应该有 1 个机密客户端应用程序。我们建议每个会话有 1 个令牌缓存,因此每个会话应该有 1 个 CCA。

由于这个问题中的实现基本上有 1 个令牌缓存,我认为它是安全的,但无论如何都要求确认,这个https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/issues/1342#issuecomment- 525286547是答案:

是的,对于客户端凭据流,单例应该可以正常工作。您正在为应用程序而不是用户请求令牌。无论有多少用户和会话,内存缓存中都只有 1 个访问令牌(对于应用程序)