2015-04-07 6 views
8

Ich habe eine ASP.NET MVC 5 App, die sich gegen Azure Active Directory authentifiziert. Ich wollte SSL in der gesamten App aktivieren. und damit globale Filter genutzt wie folgt:Aktivieren von SSL in ASP.NET MVC 5 App führt zu OpenIdConnectProtocolValidator Problem

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 Ich habe auch ‚SSL aktivieren‘ in den Eigenschaften des Projekts zu wahren. Dies gab mir die folgende SSL-URL ->https://localhost:34567. Ich habe das Projekt aktualisiert, um dies in seinem IIS Express-Pfad unter dem "Web Tab" unter Server in "Project URL" zu haben. Beim Ausführen der Site lief ich jedoch zu folgendem Fehler:

IDX10311: RequireNonce is 'true' (default) but validationContext.Nonce is null. A nonce cannot be validated. If you don't need to check the nonce, set OpenIdConnectProtocolValidator.RequireNonce to 'false'.

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

Der Sicherheitscode ist 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 lesen und sind 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 RequireNonce auf false versucht Einstellung wie in der Fehlermeldung gerichtet wie folgt:

ProtocolValidator = new OpenIdConnectProtocolValidator 
       { 
        RequireNonce = false 
       } 

Aber dies ist nur in Folge einer ungültigen Fehler anfordern

Könnte jemand mir helfen zu verstehen, was das Problem hier ist? Alles hat gut funktioniert, bis SSL aktiviert wurde.

+1

Denken Sie, dass ich das herausgefunden habe. Die App. Details in Azure AD sind fest auf den ursprünglichen HTTP-Endpunkt angewiesen. Ich werde dies aktualisieren, sobald ich meine Theorie bestätigt habe. –

+0

Ich bekomme das auch ... –

+0

Bitte, hast du es geschafft, diesen Fehler zu beheben? Ich bin in der gleichen Situation. – Mastenka

Antwort

13

Sie können Ausnahmen ignorieren, wenn die Fehlermeldung mit OICE_20004 beginnt oder IDX10311 enthält. Hinweis: Tun Sie es 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); 
    }, 
} 
+4

Könnten Sie bitte etwas mehr Beschreibung zu der von Ihnen bereitgestellten Lösung hinzufügen? – abarisone

+1

Arbeitete für mich, in Szenario: Benutzer verwendet Browser zurück, um zur SSO-Authentifizierungsseite zu navigieren. –

+0

können Sie eine Beschreibung hinzufügen. –

2

Ich kann diesen Fehler reproduzieren, indem ich einige Male auf meiner Webanwendung auf die Schaltfläche "Zurück" klicke, auch nach erfolgreichem Login. im Code unten: können Sie diese 2 Dinge versuchen

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

add Protokoll Validator als auf den Authentifizierungsoptionen, wie das, was Fehler vorschlagen:

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

oder Benachrichtigung hinzufügen, damit Sie kann diesen Fehler abfangen und auf eine Fehlerseite umleiten. Ich mache das, um es anmutig zu machen. Bis Katana Leute es repariert.

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

Aus dem Management-Portal Azure, überprüfen Sie, dass Ihre Bewerbung unter dem entsprechenden Active Directory den gleichen Sign On URL und Antwort URL hat.

Wenn sie nicht gleich sind, wird diese Fehlermeldung angezeigt.

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

Edit: Lesen Sie weiter, wenn Sie genau wissen wollen, warum dies geschieht,

Wenn Sie versuchen, Ihre App für den Zugriff auf die https-URL verwenden, setzt ein Cookie mit einer eindeutigen Nummer (Nonce) in Ihrem Browser und trifft Azure AD zur Authentifizierung. Nach der Authentifizierung muss der Browser Zugang zu diesem Cookie geben. Da die Anmelde-URL und die Antwort-URL jedoch unterschiedlich sind, erkennt der Browser Ihre App nicht und gewährt keinen Zugriff auf diesen Cookie. Daher gibt die Anwendung diesen Fehler aus.

1

Ich kann dieses Problem mit der folgenden Methode in der Datei Global.asax umgehen. Zumindest wird dies die Ausnahme für den Client nicht zeigen. Ich verwende ELMAH, um Ausnahmen zu erfassen.

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");     
     } 
0

Nun wäre es wahrscheinlich am besten, am katana Quellcode zu suchen, von dem ich den Ausnahmetyp gefunden OpenIdConnectProtocolInvalidNonceException zu sein, so kann ich damit umgehen wie diese.

Ich habe dieses Ausnahme-Popup auf Browsern, die die Seiten zwischenspeichern und Benutzer, die nach der Anmeldung auf die Zurück-Schaltfläche klicken.

0

Das Problem hier ist einfach ... nahm mich Stunden, um dies herauszufinden. Da ich auf meinem lokalen getestet hatte keine HTTPS und um die Wahrheit zu sagen, beim ersten Erstellen meiner App in Azure AD, da ich nicht erwartet, dass es HTTPS während meines Tests Ich habe es einfach HTTP (ReplyUrl's HomePage URL, Logout all das Jazz

) diese

Dann begegnet Ausgabe der infinate Schleife i nachdem ich eine Menge Leute bekommen. also entschied ich mich, das cert auf meinem lokalen und yep zu verspotten, das die infinate umleitung los wurde, aber dann brachte ein anderes das "IDX10311: RequireNonce ist 'wahr'" ein

Lange Geschichte kurz ... machen Sie Ihre AzureAD App https in allen seinen Endpunkten. und Wallah!

0

Ich fügte nur einen weiteren Fall hinzu, in den ich gerade hineingeraten bin: Das Netzwerk, mit dem Sie eine Verbindung herstellen, ändert möglicherweise den HTML-Inhalt.

Ein Kunde rief mit einem Problem auf: Er konnte diesen Fehler nicht beheben. Es war ein neuer Laptop, bei dem er sich vorher nicht angemeldet hatte. Nach ungefähr einer Stunde, in der ich mehrere mögliche Lösungen ausprobierte, entschied ich mich, das Netzwerk zu überprüfen, mit dem er verbunden war.

Es stellte sich heraus, er war mit einem Netzwerk in einem Flughafen verbunden, offen und ungesichert, und nicht mit einem VPN-Dienst (fehlt einige SETA dort). Ich weiß nicht genau, wer dieses Netzwerk betrieben hat oder was sie getan haben, aber der Azure AD-Dienst muss irgendeine Art von Manipulation mit der Nonce entdeckt haben.

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