it-swarm.com.de

Das Aktivieren von SSL in der ASP.NET MVC 5-App führt zu einem OpenIdConnectProtocolValidator-Problem

Ich habe eine ASP.NET MVC 5-App, die sich bei Azure Active Directory authentifiziert. Ich wollte SSL für die gesamte App aktivieren. und setzte daher globale Filter wie folgt ein:

public class FilterConfig
{
    /// <summary>
    /// Registers the global filters.
    /// </summary>
    /// <param name="filters">The filters.</param>
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new RequireHttpsAttribute());
    }
}

Danach habe ich in den Projekteigenschaften auch 'SSL aktivieren' auf true gesetzt. Dies gab mir die folgende SSL-URL -> https: // localhost: 34567 . Ich habe das Projekt so aktualisiert, dass es diesen in seinem IIS Express-Pfad unter der Registerkarte "Web" unter "Server" in "Projekt-URL" enthält. Beim Ausführen der Website erhalte ich jedoch den folgenden Fehler:

IDX10311: RequireNonce ist 'true' (Standard), validationContext.Nonce ist jedoch null. Ein Nonce kann nicht validiert werden. Wenn Sie das Nonce nicht überprüfen müssen, setzen Sie OpenIdConnectProtocolValidator.RequireNonce auf 'false'.

Ich habe Auth. auf der Website aktiviert. Ich verwende Azure Active Directory.

Der Sicherheitscode lautet wie folgt:

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri                    
            });

        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Audience = audience,
                Tenant = tenant,      
            });

Die auth. Werte werden aus der web.config gelesen und lauten wie folgt:

<add key="ida:ClientId" value="<some_guid>" />
<add key="ida:Audience" value="https://localhost:34567/" />
<add key="ida:AADInstance" value="https://login.windows.net/{0}" />
<add key="ida:Tenant" value="Microsoft.onmicrosoft.com" />
<add key="ida:PostLogoutRedirectUri" value="https://localhost:34567/" />

Ich habe versucht, RequireNonce wie in der Fehlermeldung angegeben auf false zu setzen:

ProtocolValidator = new OpenIdConnectProtocolValidator
                {
                    RequireNonce = false
                }

Dies führte jedoch nur zu einem ungültigen Anforderungsfehler.

Könnte mir jemand helfen zu verstehen, wo das Problem liegt? Alles hat super funktioniert, bis SSL aktiviert wurde.

11

Sie können Ausnahmen ignorieren, wenn die Fehlermeldung mit OICE_20004 beginnt oder IDX10311 enthält. Hinweis: Tun Sie dies auf eigenes Risiko.

Notifications = new OpenIdConnectAuthenticationNotifications()
{
    RedirectToIdentityProvider = (context) =>
    {
        // Ensure the URI is picked up dynamically from the request;
        string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + context.Request.Uri.PathAndQuery;
        context.ProtocolMessage.RedirectUri = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + context.Request.Uri.PathAndQuery;
        context.ProtocolMessage.PostLogoutRedirectUri = appBaseUrl;
        return Task.FromResult(0);
    },
    AuthenticationFailed = (context) =>
    {
        if (context.Exception.Message.StartsWith("OICE_20004") || context.Exception.Message.Contains("IDX10311"))
        {
            context.SkipToNextMiddleware();
            return Task.FromResult(0);
        }
        return Task.FromResult(0);
    },
}
14
zb3b

Überprüfen Sie im Azure-Verwaltungsportal, ob Ihre Anwendung unter dem entsprechenden Active Directory die gleiche Anmelde-URL und Antwort-URL hat.

 

 

Wenn sie nicht gleich sind, erhalten Sie diese Fehlermeldung.

Dies passiert, wenn Sie SSL aktivieren, da nur die Anmelde-URL in die HTTPS-URL geändert wird, während die Antwort-URL dieselbe HTTP-URL bleibt.

Bearbeiten: Lesen Sie weiter, wenn Sie genau wissen möchten, warum dies geschieht,

Wenn Sie versuchen, über die https-URL auf Ihre App zuzugreifen, wird ein Cookie mit einer eindeutigen Nummer (nonce) in Ihrem Browser festgelegt und die Authentifizierung erfolgt über Azure AD. Nach der Authentifizierung muss der Browser Zugriff auf dieses Cookie gewähren. Da sich die Anmelde-URL und die Antwort-URL unterscheiden, erkennt der Browser Ihre App nicht und gewährt keinen Zugriff auf dieses Cookie. Daher gibt die Anwendung diesen Fehler aus.

9
Naren

Ich kann diesen Fehler reproduzieren, indem ich in meiner Webanwendung einige Male auf die Schaltfläche "Zurück" drücke, auch nach erfolgreicher Anmeldung. kannst du diese 2 Dinge ausprobieren: in deinem Code unten:

app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = mViewWebSite.ClientId,
                    Authority = mViewWebSite.Authority,
                    PostLogoutRedirectUri = mViewWebSite.PostLogoutRedirectUri
                });

fügen Sie den Protokollvalidator wie in den Authentifizierungsoptionen beschrieben hinzu.

ProtocolValidator = new Microsoft.IdentityModel.Protocols.OpenIdConnectProtocolValidator(){
                            RequireNonce = false
                        }

oder fügen Sie eine Benachrichtigung hinzu. Auf diese Weise können Sie diesen Fehler abfangen und auf eine Fehlerseite umleiten. Ich mache das, um es anmutig zu machen. Bis die Katana-Leute es reparieren.

Notifications = new OpenIdConnectAuthenticationNotifications
                        {
                            AuthenticationFailed = context =>
                            {
                                context.HandleResponse();
                                context.Response.Redirect("/Error.aspx?message=" + context.Exception.Message);
                                return Task.FromResult(0);
                            }
                        },
4
Abs

Es gelingt mir, dieses Problem mithilfe der folgenden Methode in der Datei "Global.asax" zu umgehen. Zumindest zeigt dies dem Client die Ausnahme nicht an. Ich benutze ELMAH, um Ausnahmen zu fangen.

protected void Application_Error(object sender, EventArgs args)
    {
        var ex = Server.GetLastError();
        if (ex.Message.Contains("IDX10311:"))
        {
            Server.ClearError();
            Response.Redirect("https://www.yoursitename.com");                 
        }
1
user6745503

Das Problem hier ist einfach ... Ich brauchte Stunden, um das herauszufinden. Da ich in meinem lokalen Test keine https hatte und ehrlich gesagt beim erstmaligen Erstellen meiner App in Azure AD, da ich nicht damit gerechnet habe, dass es sich bei meinem Test um https handelt, habe ich es als http (replyUrls HomePage-URL, Logout all that jazz) deklariert.

Dann, nachdem ich dies getan habe, stieß ich auf das Endlosschleifenproblem , das viele Leute bekommen. Also habe ich mich entschlossen, das Zertifikat auf meinem Local zu verspotten und yep, das die unendliche Weiterleitung beseitigt hat, aber dann ein anderes mitgebracht, das "IDX10311: RequireNonce is 'true'"

Lange Rede, kurzer Sinn ... machen Sie Ihre AzureAD-App an allen Endpunkten https. und wallah!

1
Egli Becerra

Nun, es wäre wahrscheinlich am besten, sich den Katana-Quellcode anzuschauen. Daher fand ich, dass der Ausnahmetyp OpenIdConnectProtocolInvalidNonceException ist, also gehe ich so vor.

        if (n.Exception is OpenIdConnectProtocolInvalidNonceException &&
            n.OwinContext.Authentication.User.Identity.IsAuthenticated)
        {
            n.SkipToNextMiddleware();
            return;
        }

Ich habe diese Ausnahmebedingung bei Browsern, die die Seiten und Benutzer zwischenspeichern, die nach der Anmeldung auf die Schaltfläche "Zurück" klicken.

1
jonmeyer

Ich füge nur einen weiteren Fall hinzu, auf den ich gerade gestoßen bin: Das Netzwerk, zu dem Sie eine Verbindung herstellen, verändert möglicherweise HTML-Inhalte.

Ein Kunde rief mit einem Problem an: Er konnte diesen Fehler nicht überwinden. Es war ein neuer Laptop, an dem er sich noch nie angemeldet hatte. Nachdem ich ungefähr eine Stunde lang verschiedene mögliche Lösungen ausprobiert hatte, entschied ich mich, das Netzwerk zu überprüfen, mit dem er verbunden war.

Es stellte sich heraus, dass er mit einem Netzwerk in einem Flughafen verbunden war, offen und ungesichert war und keinen VPN-Dienst verwendete (es fehlten einige SETA dort). Ich weiß nicht genau, wer dieses Netzwerk betrieben hat oder was sie getan haben, aber der Azure AD-Dienst muss eine Art Manipulation an der Nonce festgestellt haben.

Sobald der Benutzer eine Verbindung zu einem vertrauenswürdigen Netzwerk hergestellt hat, wurde das Problem behoben.

0
SvenAelterman

@ zb3b Antwort + @jonmeyer Antwort :

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
    ...
    Notifications = new OpenIdConnectAuthenticationNotifications()
    {
        ...
        AuthenticationFailed = (context) =>
        {
            if ((context.Exception is OpenIdConnectProtocolInvalidNonceException) &&
                (context.OwinContext.Authentication.User.Identity.IsAuthenticated))
            {
                context.SkipToNextMiddleware();
                return Task.FromResult(0);
            }

            return Task.FromResult(0);
        },
        ...
    }
});
0
Daniel Genezini