Obtenir un jeton à partir du cache de jetons à l’aide de MSAL.NET

Lorsque vous obtenez un jeton d’accès à l’aide du Microsoft Authentication Library pour .NET (MSAL.NET), le jeton est mis en cache. Lorsque l’application a besoin d’un jeton, elle doit d’abord tenter de l’extraire du cache.

Vous pouvez surveiller la source des jetons en inspectant la AuthenticationResult.AuthenticationResultMetadata.TokenSource propriété.

Sites web et API web

ASP.NET Core et les sites web ASP.NET Classic doivent s’intégrer à Microsoft. Identity.Web, wrapper pour MSAL.NET. La mise en cache des jetons de mémoire ou la mise en cache des jetons distribués peuvent être configurées comme décrit dans la sérialisation du cache de jetons.

Les API web sur ASP.NET Core doivent utiliser Microsoft. Identity.Web. Les API web sur ASP.NET classique, utilisent DIRECTEMENT MSAL en appelant AcquireTokenOnBehalfOf et doivent configurer la mémoire ou la mise en cache distribuée. Pour plus d’informations, consultez Sérialisation du cache de jetons dans MSAL.NET. Il n’y a aucune raison d’appeler l’API AcquireTokenSilent , car il n’y a pas d’API pour effacer le cache. La taille du cache peut être gérée en définissant des stratégies d’éviction sur le magasin de cache sous-jacent, comme MemoryCache, Redis, etc.

Service web / Applications Daemon

Les applications qui demandent des jetons pour une identité d’application, sans intervention d’utilisateur, en appelant AcquireTokenForClient, peuvent soit s’appuyer sur le cache interne de MSAL, soit définir leur propre cache mémoire des jetons ou un cache distribué des jetons. Pour obtenir des instructions et plus d’informations, consultez sérialisation du cache de jetons dans MSAL.NET.

Comme aucun utilisateur n’est impliqué, il n’y a aucune raison d’appeler AcquireTokenSilent. AcquireTokenForClient recherche dans le cache lui-même, car il n’existe aucune API pour effacer le cache. La taille du cache est proportionnelle au nombre de clients et de ressources pour lesquelles vous avez besoin de jetons. La taille du cache peut être gérée en définissant des stratégies d’éviction sur le magasin de cache sous-jacent, comme MemoryCache, Redis, etc.

Applications de bureau, de ligne de commande et mobiles

Les applications de bureau, de ligne de commande et mobiles doivent d’abord appeler la AcquireTokenSilent méthode pour vérifier si un jeton acceptable se trouve dans le cache. Dans de nombreux cas, il est possible d’obtenir un autre jeton avec davantage d’autorisations à partir d’un jeton présent dans le cache. Il est également possible d’actualiser un jeton lorsqu’il est proche de l’expiration (car le cache de jetons contient également un jeton d’actualisation).

Pour les flux d’authentification qui nécessitent une interaction utilisateur, MSAL met en cache les jetons d’accès, d’actualisation et d’ID et l’objet IAccount , qui représente des informations sur un seul compte. En savoir plus sur IAccount. Pour les flux d’application, tels que les informations d’identification du client, seuls les jetons d’accès sont mis en cache, car l’objet et le IAccount jeton d’ID nécessitent un utilisateur, et le jeton d’actualisation n’est pas applicable.

Le modèle recommandé consiste à appeler la AcquireTokenSilent méthode en premier. Si AcquireTokenSilent échoue, obtenez un jeton par d’autres méthodes.

Dans l’exemple suivant, l’application tente d’abord d’acquérir un jeton à partir du cache de jetons. Si une MsalUiRequiredException exception est levée, l’application acquiert un jeton de manière interactive.

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
}

Effacement du cache

Dans les applications clientes publiques, la suppression des comptes du cache l’efface. Toutefois, cela ne supprime pas le cookie de session, qui se trouve dans le navigateur.

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

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