Ottenere un token dalla cache dei token usando MSAL.NET

Quando si acquisisce un token di accesso usando il Libreria di Autenticazione Microsoft per .NET (MSAL.NET), il token viene memorizzato nella cache. Quando l'applicazione richiede un token, deve prima tentare di recuperarlo dalla cache.

È possibile monitorare l'origine dei token esaminando la AuthenticationResult.AuthenticationResultMetadata.TokenSource proprietà .

Siti Web e API Web

ASP.NET Core e ASP.NET siti Web classici devono essere integrati con Microsoft. Identity.Web, wrapper per MSAL.NET. La memorizzazione nella cache dei token di memoria o la memorizzazione nella cache distribuita possono essere configurate come descritto nella serializzazione della cache dei token.

Le API Web in ASP.NET Core devono usare Microsoft. Identity.Web. Le API Web su ASP.NET classico usano MSAL direttamente, chiamando AcquireTokenOnBehalfOf, e devono configurare una cache in memoria o distribuita. Per altre informazioni, vedere Serializzazione della cache dei token in MSAL.NET. Non esiste alcun motivo per chiamare l'API AcquireTokenSilent perché non esiste alcuna API per cancellare la cache. Le dimensioni della cache possono essere gestite impostando criteri di rimozione nell'archivio cache sottostante, ad esempio MemoryCache, Redis e così via.

Servizio Web/App Daemon

Le applicazioni che richiedono token per un'identità applicativa, senza il coinvolgimento di alcun utente, tramite una chiamata a AcquireTokenForClient possono fare affidamento sulla cache interna di MSAL oppure definire una propria cache dei token in memoria o una cache distribuita dei token. Per istruzioni e altre informazioni, vedere Serializzazione della cache dei token in MSAL.NET.

Poiché non è coinvolto alcun utente, non esiste alcun motivo per chiamare AcquireTokenSilent. AcquireTokenForClient cercherà in modo autonomo nella cache perché non esiste alcuna API per cancellare la cache. Le dimensioni della cache sono proporzionali al numero di tenant e risorse necessarie per i token. Le dimensioni della cache possono essere gestite impostando criteri di rimozione nell'archivio cache sottostante, ad esempio MemoryCache, Redis e così via.

Applicazioni desktop, riga di comando e per dispositivi mobili

Le applicazioni desktop, della riga di comando e per dispositivi mobili devono prima chiamare il AcquireTokenSilent metodo per verificare se un token accettabile si trova nella cache. In molti casi, è possibile acquisire un altro token con più ambiti in base a un token nella cache. È anche possibile aggiornare un token quando si avvicina alla scadenza, perché la cache dei token contiene anche un token di aggiornamento.

Per i flussi di autenticazione che richiedono un'interazione utente, MSAL memorizza nella cache i token di accesso, aggiornamento e ID e l'oggetto IAccount , che rappresenta informazioni su un singolo account. Altre informazioni su IAccount. Per i flussi dell'applicazione, ad esempio le credenziali client, vengono memorizzati nella cache solo i token di accesso, perché l'oggetto e il IAccount token ID richiedono un utente e il token di aggiornamento non è applicabile.

Il modello consigliato consiste nel chiamare prima il AcquireTokenSilent metodo . Se AcquireTokenSilent ha esito negativo, acquisire un token usando altri metodi.

Nell'esempio seguente l'applicazione tenta prima di tutto di acquisire un token dalla cache dei token. Se viene generata un'eccezione MsalUiRequiredException , l'applicazione acquisisce un token in modo interattivo.

var accounts = await app.GetAccountsAsync();

AuthenticationResult result = null;
try
{
     result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
                       .ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
    // A MsalUiRequiredException happened on AcquireTokenSilent.
    // This indicates you need to call AcquireTokenInteractive to acquire a token
    Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

    try
    {
        result = await app.AcquireTokenInteractive(scopes)
                          .ExecuteAsync();
    }
    catch (MsalException msalex)
    {
        ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
    }
}
catch (Exception ex)
{
    ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
    return;
}

if (result != null)
{
    string accessToken = result.AccessToken;
    // Use the token
}

Cancellazione della cache

Nelle applicazioni client pubbliche, la rimozione degli account dalla cache lo cancella. Tuttavia, questo non rimuove il cookie di sessione, che si trova nel browser.

var accounts = (await app.GetAccountsAsync()).ToList();

// clear the cache
while (accounts.Any())
{
   await app.RemoveAsync(accounts.First());
   accounts = (await app.GetAccountsAsync()).ToList();
}