1

我有以下简单的 .NET 脚本:

static void Main(string[] args)
{
    var result1 = Login().Result;
    var result2 = Login().Result;
}

public static async Task<AuthenticationResult> Login()
{
    var options = new PublicClientApplicationOptions();
    options.TenantId = "...";
    options.ClientId = "...";

    var app = PublicClientApplicationBuilder.CreateWithApplicationOptions(options)
                    .WithDefaultRedirectUri()
                    .Build();

    AuthenticationResult result;
    var accounts = await app.GetAccountsAsync();
    IAccount account = accounts.FirstOrDefault();
    var scopes = new string[] { "..." };
    try
    {
        result = await app.AcquireTokenSilent(scopes, account).ExecuteAsync();
    }
    catch (MsalUiRequiredException)
    {
        result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
    }
    return result;
}

我的期望是第一个 Login(...) 调用执行交互式身份验证,然后第二个调用 var accounts = await app.GetAccountsAsync() 返回之前登录的帐户。但是,这些帐户没有任何项目。因此,似乎令牌缓存不是这些调用的一部分。

有没有办法在第一次通话中存储登录的帐户?不应该是自动的吗?

4

1 回答 1

1

我遇到了同样的问题,在用 ilspy 探索了 MSAL 库之后,我发现缓存存储在IPublicClientApplication它自己的应用程序中。

因此,如果您重用app,您也将获得缓存的优势。

于 2020-08-03T17:15:18.300 回答