Abrufen eines Tokens aus dem Tokencache mithilfe von MSAL.NET

Wenn Sie ein Zugriffstoken mithilfe der Microsoft Authentication Library (MSAL) für .NET (MSAL.NET) erwerben, wird das Token zwischengespeichert. Wenn die Anwendung ein Token benötigt, sollte sie zuerst versuchen, es aus dem Cache abzurufen.

Sie können die Quelle der Token überwachen, indem Sie die AuthenticationResult.AuthenticationResultMetadata.TokenSource Eigenschaft überprüfen.

Websites und Web-APIs

ASP.NET Core- und klassische ASP.NET-Websites sollten in Microsoft.Identity.Web integriert werden, einem Wrapper für MSAL.NET. Speichertokenzwischenspeicherung oder verteilte Tokenzwischenspeicherung können wie in der Serialisierung des Tokencaches beschrieben konfiguriert werden.

Web-APIs unter ASP.NET Core sollten Microsoft.Identity.Web verwenden. Web-APIs auf klassischem ASP.NET verwenden MSAL direkt, indem sie AcquireTokenOnBehalfOf aufrufen, und sollten In-Memory- oder verteiltes Caching konfigurieren. Weitere Informationen finden Sie unter Serialisierung des Tokencaches in MSAL.NET. Es gibt keinen Grund, die AcquireTokenSilent API aufzurufen, da keine API zum Löschen des Caches vorhanden ist. Die Cachegröße kann verwaltet werden, indem Richtlinien für die Entfernung im zugrunde liegenden Cachespeicher festgelegt werden, z. B. MemoryCache, Redis usw.

Webdienst/Daemon-Apps

Anwendungen, die durch Aufrufen von AcquireTokenForClient Token für eine App-Identität anfordern, ohne dass ein Benutzer beteiligt ist, können sich entweder auf das interne Caching von MSAL verlassen oder eigene Tokencaches im Arbeitsspeicher bzw. verteilte Tokencaches definieren. Anweisungen und weitere Informationen finden Sie unter Serialisierung des Tokencaches in MSAL.NET.

Da kein Benutzer beteiligt ist, gibt es keinen Grund, AcquireTokenSilent aufzurufen. AcquireTokenForClient wird selbst im Cache nachsehen, da es keine API zum Leeren des Cache gibt. Die Cachegröße ist proportional zur Anzahl der Mandanten und Ressourcen, für die Sie Token benötigen. Die Cachegröße kann verwaltet werden, indem Richtlinien für die Entfernung im zugrunde liegenden Cachespeicher festgelegt werden, z. B. MemoryCache, Redis usw.

Desktop-, Befehlszeilen- und mobile Anwendungen

Desktop-, Befehlszeilen- und mobile Anwendungen sollten zuerst die AcquireTokenSilent Methode aufrufen, um zu überprüfen, ob sich ein akzeptables Token im Cache befindet. In vielen Fällen ist es möglich, ein weiteres Token mit mehr Bereichen basierend auf einem Token im Cache abzurufen. Es ist auch möglich, ein Token zu aktualisieren, wenn es nah am Ablauf liegt (da der Tokencache auch ein Aktualisierungstoken enthält).

Bei Authentifizierungsflüssen, die eine Benutzerinteraktion erfordern, zwischenspeichert MSAL die Zugriffs-, Aktualisierungs- und ID-Token sowie das IAccount-Objekt, das Informationen über ein einzelnes Konto darstellt. Weitere Informationen zu IAccount. Bei Anwendungsflüssen, z. B. Clientanmeldeinformationen, werden nur Zugriffstoken zwischengespeichert, da das Objekt und das IAccount ID-Token einen Benutzer erfordern und das Aktualisierungstoken nicht anwendbar ist.

Das empfohlene Muster besteht darin, die AcquireTokenSilent Methode zuerst aufzurufen. Wenn AcquireTokenSilent fehlschlägt, fordern Sie ein Token mit anderen Methoden an.

Im folgenden Beispiel versucht die Anwendung zunächst, ein Token aus dem Tokencache abzurufen. Wenn eine MsalUiRequiredException Ausnahme ausgelöst wird, erwirbt die Anwendung interaktiv ein Token.

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
}

Löschen des Caches

In öffentlichen Clientanwendungen wird der Cache geleert, wenn Konten daraus entfernt werden. Dies entfernt jedoch nicht das Sitzungscookies, das sich im Browser befindet.

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

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