Freigeben über


Fehler "Es wurde kein Konto- oder Anmeldehinweis an das AcquireTokenSilent" in Webanwendungen ohne beständigen Tokencache übergeben.

Dieser Artikel enthält Lösungen für den Fehler "Kein Konto oder Anmeldehinweis wurde an den AcquireTokenSilent"-Fehler übergeben, der in einer Webanwendung mit Microsoft Authentication Library (MSAL) oder Microsoft Identity Web auftritt.

Symptome

Gehen Sie davon aus, dass Ihre Webanwendungen Benutzer mit MSAL oder Microsoft Identity Web authentifizieren und keine persistenten Tokencaches verwenden. Wenn MSAL versucht, ein Benutzerkonto abzurufen und ein Token im Hintergrund aus dem Tokencache abzurufen, wird die folgende Fehlermeldung angezeigt:

Es wurde kein Konto- oder Anmeldehinweis an das AcquireTokenSilent übergeben.

Ursache

Dieses Problem tritt auf, da MSAL basierend auf einem vorhandenen Authentifizierungscookies nach einem Konto sucht, das nicht mehr im Tokencache vorhanden ist. Das Authentifizierungscookies wird erst nach einer interaktiven Anmeldung erstellt und enthält Informationen zum Benutzer. Dieses Problem tritt in den folgenden Szenarien auf:

  • Die Webanwendung wurde neu gestartet.
  • Der Speicher wird aufgrund einer hohen Speicherauslastung oder eines festgelegten Zeitraums von Inaktivität gelöscht.
  • MSAL verfügt über einen Standardmäßigen Grenzwert für die Cachegröße, der ältere Einträge automatisch entfernt.

Sie können einen persistenten Tokencache an einem dauerhaften Speicherort wie SQL Server oder dateibasiertem Speicher implementieren. Ein persistenter Tokencache stellt sicher, dass Token beibehalten werden, auch wenn die Anwendung neu gestartet wird oder der Speicher gelöscht wird. Weitere Informationen zum Implementieren eines benutzerdefinierten persistenten Tokencaches finden Sie unter Serialisierung des Tokencaches.

Sie können ein Cookie-Authentifizierungsereignis implementieren, um zu überprüfen, ob der aktuell angemeldete Benutzer im MSAL-Tokencache vorhanden ist. Wenn der Benutzer nicht vorhanden ist, lehnen Sie das Authentifizierungscookies ab, und erzwingen Sie, dass sich der aktuelle Benutzer erneut anmeldet.

Für ASP.NET Webanwendungen mit MSAL

Erstellen eines Cookie-Authentifizierungsereignisses:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    Provider = new CookieAuthenticationProvider()
    {
        OnValidateIdentity = async context =>
        {
            IConfidentialClientApplication clientApp = MsalAppBuilder.BuildConfidentialClientApplication();
        
                var signedInUserIdentity = new ClaimsPrincipal(context.Identity);
        
                if (await clientApp.GetAccountAsync(signedInUserIdentity.GetAccountId()) == null)
        
                {
        
                    context.RejectIdentity();
        
                }
    
        }
    
    }

});

Hinweis

Um ein Cookie-Authentifizierungsereignis zu implementieren, muss die Webanwendung die folgenden Hilfsklassen und das Microsoft.Identity.Web.TokenCache NuGet-Paket installieren:

  • MsalAppBuilder.cs
  • AuthenticationConfig.cs

Für ASP.NET Core-Webanwendungen mit MSAL

  1. Erstellen eines benutzerdefinierten Cookie-Authentifizierungsereignisses:

    using Microsoft.AspNetCore.Authentication.Cookies;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Client;
    using System.Threading.Tasks;
    using System.Security.Claims;
    
    namespace SampleApp.Services
    {
        internal class RejectSessionCookieWhenAccountNotInCacheEvents : CookieAuthenticationEvents
        {
            public async override Task ValidatePrincipal(CookieValidatePrincipalContext context)
            {
                var msalInstance = context.HttpContext.RequestServices.GetRequiredService();
                IConfidentialClientApplication msalClient = msalInstance.GetClient();
    
                        var accounts = await msalClient.GetAccountsAsync();
    
                        var account = await msalClient.GetAccountAsync(accounts.FirstOrDefault());
    
                        if (account == null)
    
                        {
    
                            context.RejectPrincipal();
    
                        }
    
                        await base.OnValidatePrincipal(context);
    
                }
    
        }
    
    }
    
  2. Registrieren Sie das benutzerdefinierte Cookie-Authentifizierungsereignis:

    Services.Configure<CookieAuthenticationOptions>(cookieScheme, options=>options.Events=new RejectSessionCookieWhenAccountNotInCacheEvents());
    

Für Webanwendungen mit Microsoft Identity Web

Microsoft Identity Web bietet integrierte Mechanismen zum Verwalten von Tokencaches. Weitere Informationen finden Sie unter Verwalten der inkrementellen Zustimmung und des bedingten Zugriffs. Wenn Dieses Dokument Ihnen nicht hilft, das Problem zu beheben, können Sie das Authentifizierungscookies mithilfe eines benutzerdefinierten Cookie-Authentifizierungsereignisses manuell löschen:

  1. Erstellen eines benutzerdefinierten Cookie-Authentifizierungsereignisses:

    using Microsoft.AspNetCore.Authentication.Cookies;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Client;
    using Microsoft.Identity.Web;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace SampleApp.Services
    {
        internal class RejectSessionCookieWhenAccountNotInCacheEvents : CookieAuthenticationEvents
        {
            public async override Task ValidatePrincipal(CookieValidatePrincipalContext context)
            {
                try
                {
                    var tokenAcquisition = context.HttpContext.RequestServices.GetRequiredService();
                    string token = await tokenAcquisition.GetAccessTokenForUserAsync(
                    scopes: new[] { "profile" },
                    user: context.Principal);
                }
                catch (MicrosoftIdentityWebChallengeUserException ex)
                when (AccountDoesNotExistInTokenCache(ex))
                {
                    context.RejectPrincipal();
                }
            }
            /// <summary>
            /// Is the exception due to no account in the token cache?
            /// </summary>
            /// <param name="ex">Exception thrown by <see cref="ITokenAcquisition"/>.GetTokenForXX methods.</param>
            /// <returns>A boolean indicating if the exception relates to the absence of an account in the cache.</returns>
            private static bool AccountDoesNotExistInTokenCache(MicrosoftIdentityWebChallengeUserException ex)
            {
                return ex.InnerException is MsalUiRequiredException
    
                       && (ex.InnerException as MsalUiRequiredException).ErrorCode == "user_null";
    
            }
    
        }
    
    }
    
  2. Registrieren Sie das benutzerdefinierte Cookie-Authentifizierungsereignis:

    // Add Microsoft Identity Web
    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
                        .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
                            .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
                               .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
                               .AddInMemoryTokenCaches();
    
    // Register the Custom Cookie Authentication event
    Services.Configure<CookieAuthenticationOptions>(cookieScheme, options=>options.Events=new RejectSessionCookieWhenAccountNotInCacheEvents());
    

Kontaktieren Sie uns für Hilfe

Wenn Sie Fragen haben oder Hilfe benötigen, erstellen Sie eine Support-Anfrage oder wenden Sie sich an den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.