Dela via


Felen "ValidationContext.Nonce är null" i ASP.NET MVC-appar

Den här artikeln innehåller lösningar på vanliga nonce-valideringsfel som du kan stöta på i ASP.NET MVC-appar med hjälp av Mellanprogram för OpenID Connect (OIDC).

Vanliga felmeddelanden

Beroende på vilken version av Open Web Interface för .NET (OWIN) som du använder kan du få något av följande felmeddelanden:

  • IDX21323: RequireNonce är "[PII är dold som standard. Ange flaggan "ShowPII" i IdentityModelEventSource.cs till true för att visa den.]'. OpenIdConnectProtocolValidationContext.Nonce var null, OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce var inte null. Det går inte att verifiera nonce. Om du inte behöver kontrollera nonce anger du OpenIdConnectProtocolValidator.RequireNonce till false.

  • IDX10311: RequireNonce är "true" (standard) men validationContext.Nonce är null. Det går inte att verifiera en nonce. Om du inte behöver kontrollera nonce anger du OpenIdConnectProtocolValidator.RequireNonce till false.

Förstå nonce cookies

ASP.NET OIDC-mellanprogrammet använder en nonce-cookie för att förhindra reprisattacker. Appen genererar undantaget om den inte kan hitta nonce-cookien i den autentiserade begäran. Cookies är domänbaserade. Det innebär att om cookies anges för en specifik domän kommer alla efterföljande begäranden till den domänen att inkludera cookies tills de upphör att gälla eller tas bort.

Följande Fiddler-spårningar beskriver hur dessa cookies anges och används i ett arbetsflöde:

  • I Bildruta 116 skickar webbläsaren en begäran till OIDC-appen som skyddas av Microsoft Entra-ID. När du har tagit emot begäran identifierar appen att den inte är autentiserad. Sedan omdirigeras begäran till Microsoft Entra ID (login.microsoftonline.com) för autentisering. Dessutom anger appen cookien OpenIdConnect.nonce i omdirigeringssvaret "302".

    Skärmbild av bildruta 116 i Fiddler Trace.

  • Efter lyckad autentisering (bildruta 120-228) omdirigerar Microsoft Entra ID begäran tillbaka till webbappen (bildruta 229) tillsammans med den autentiserade ID-token. Den nonce-cookie som tidigare angetts för den här domänen ingår också i POST-begäran. OIDC-mellanprogrammet validerar den autentiserade token och nonce-cookien innan den fortsätter att läsa in sidan (via en annan omdirigering). Nu är nonce-cookiens syfte slutfört och appen ogiltigförklarar den genom att ange att förfalloattributet ska upphöra att gälla.

    Skärmbild av Fiddler-spårningsramar relaterade till autentisering.

Lösning

Orsak 1: Flera domäner används för samma webbplats

Webbläsaren navigerar ursprungligen till appen på domän A (bildruta 9) och nonce-cookien har angetts för den här domänen. Senare skickar Microsoft Entra-ID:t den autentiserade token till domän B (bildruta 91). Eftersom omdirigeringen till domän B inte innehåller nonce-cookien genererar webbappen validationContext.Nonce is null felet.

Skärmbild av Fiddler-spårningsramar relaterade till orsak 1.

Lösning 1

Följ dessa anvisningar för att lösa problemet:

  1. Omdirigera begäran tillbaka till samma domän som ursprungligen användes efter autentiseringen. Om du vill styra var Azure AD skickade tillbaka den autentiserade begäran till appen anger du OpenIdConnectAuthentications.RedirectUri egenskapen i ConfigureAuth -metoden.

  2. Konfigurera omdirigerings-URI :n (svars-URL) i Appregistrering. Annars kan du få följande fel: AADSTS50011: Svars-URL:en som anges i begäran matchar inte de svars-URL:er som Azure har konfigurerat för appen. Mer information finns i Fel AADSTS50011 med OpenID-autentisering.

Orsak 2: SameSite-attribut saknas

På grund av säkerhetsuppdateringarna för SameSite-cookien bör alla cookies som ingår i autentiseringsprocessen (inklusive Nonce-cookies) innehålla följande attribut:

  • SameSite=None
  • Säkra

Mer information finns i SameSite-cookies och Öppna webbgränssnitt för .NET.

Skärmbild av saknade SameSite-attribut Fiddler-spårning.

Lösning 2

Följ dessa steg för att se till att båda de obligatoriska attributen ingår:

  1. Använd HTTPS-protokollet för att navigera till webbappen.
  2. Uppdatera .NET Framework- och NuGet-paket:
    • För .NET Framework-appar: Uppgradera .NET Framework till version 4.7.2+ och relevanta NuGet-paket (Microsoft.Owin.Security.OpenIdConnect, Microsoft.Owin) till version 4.1.0+.
    • För .NET Core-appar:
      • Version 2.x appar ska använda .NET Core 2.1+.
      • Version 3.x appar ska använda .NET Core 3.1+.

Exempel på konfigurationskod för Startup.Auth.cs:

using System.Configuration;
using Owin;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;
using System.Threading.Tasks;
using Microsoft.Owin.Security.Notifications;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;

namespace NetWebAppOIDC2
{
    public partial class Startup
    {
        private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
        private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
        private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"];
        private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
        private static string authority = aadInstance + tenantId;

        public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = clientId,
                    Authority = authority,
                    PostLogoutRedirectUri = postLogoutRedirectUri,
                    RedirectUri = "https://localhost:44313",
                    
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    {
                        AuthenticationFailed = OnAuthenticationFailed
                    }

                    // Don't use SystemwebCookieManager class here to override the default CookieManager because that seems to negate the SameSite cookie attribute that's being set.
                    // CookieManager = new SystemWebCookieManager()

                });
        }

        private Task OnAuthenticationFailed(AuthenticationFailedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context)
        {
            context.HandleResponse();
            context.Response.Redirect("/?errormessage=" + context.Exception.Message);
            return Task.FromResult(0);
        }
    }
}

Ansvarsfriskrivning för information från tredje part

De produkter från andra tillverkare som diskuteras i denna artikel tillverkas oberoende av Microsoft. Produkternas funktion eller tillförlitlighet kan därför inte garanteras.

Kontakta oss för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.