2017-02-22 3 views
1

ausgeführt Ich füge Aut0 zum einfachen Projekt hinzu und versuche zu verstehen, wie Middleware funktioniert.Wie werden Middlewares in ASP.NET Core

In meinem Startup.cs Ich habe diesen Code

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions<AuthSettings> auth0Settings) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    if (env.IsDevelopment()) 
    { 
     app.UseDeveloperExceptionPage(); 
    } 

    app.UseStaticFiles(); 

    // Add the cookie middleware 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true 
    }); 

    // Add the OIDC middleware 
    var options = new OpenIdConnectOptions("Auth0") 
    { 
     // here there are some configurations 
     // ..................... 
    }; 

    options.Scope.Clear(); 
    options.Scope.Add("openid"); 
    options.Scope.Add("name"); 
    options.Scope.Add("email"); 
    options.Scope.Add("picture"); 

    app.UseOpenIdConnectAuthentication(options); 

    app.UseMvc(routeBuilder => 
    { 
     routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}"); 
    }); 
} 

Wenn ich in ASP.NET-Core in unserem Beispiel richtig die Idee der Middleware zu verstehen, wenn es ein Cookie vorhanden ist und die Authentifizierung kann es geschehen

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true 
}); 

OpenId Middleware wird nicht ausgeführt.

app.UseOpenIdConnectAuthentication(options); 

Könnte mir jemand erklären, wie funktioniert OpenId Middleware weiß, dass es nicht ausgeführt werden sollte?

Am Boden haben wir

app.UseMvc(routeBuilder => 
{ 
    routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}"); 
}); 

Wie funktioniert es weiß, dass es immer in Fall ausgeführt werden soll, aber wo wir fordern einige statische Datei, die wir nicht Mvc verwenden.

Antwort

4

Jede einzelne Middleware in der Pipeline kann die nächste Middleware aufrufen. Der Grund dafür, dass Sie statische Dateien anstelle eines MVC-Controllers erhalten, liegt daran, dass die Middleware der statischen Datei die angeforderte Datei findet und die nächste Middleware in der Kette nicht aufruft. Es gibt einfach die Datei als Antwort zurück.

AutomaticAuthenticate in Authentifizierung Middleware bedeutet immer "überprüfen Sie die eingehende Anfrage. Wenn Sie etwas finden, das Sie interessiert, erstellen Sie eine ClaimsPrincipal von ihm." In diesem Fall erstellt die Cookie-Authentifizierung automatisch einen Principal für den angemeldeten Benutzer, wenn sich ihr Anmelde-Cookie in der Anfrage befindet, bevor die Anfrage an die nächste Middleware weitergeleitet wird.

Die OpenId Connect Middleware wird zwar ausgeführt, tut aber nichts, weil sie nichts Interessantes in der Anfrage findet, selbst wenn sie AutomaticAuthenticate = true hatte. Es sucht nach Anforderungen für seinen Rückrufpfad, der standardmäßig als CallbackPath = new PathString("/signin-oidc"); in constructor festgelegt ist.

Die zwei Authentifizierungs-Middleware sind so eingerichtet, dass die Cookie-Middleware immer ausgeführt wird, aber OpenId Connect leitet nur bei Anforderung zum Identity-Provider um (z. B. durch Rückgabe eines ChallengeResult von Ihrem MVC-Controller).

+0

Haben Sie einen Kommentar zur "AutomaticChallenge" -Eigenschaft? Welchen Effekt hat AutomaticChallenge in der UseCookieAuthentication Middleware auf true gesetzt? Meine Ergebnisse sagen mir, dass diese Eigenschaft sollte nicht auf True festgelegt werden, wenn Sie eine UseOpenIdConnectAuthentication in der Pipeline haben, dies aufgrund der Tatsache, dass die OIDC Middleware standardmäßig AutomaticChallenge auf True festgelegt haben. https://github.com/aspnet/Announcements/issues/210 –

+0

AutomaticChallenge definiert einfach, ob die Middleware so funktionieren soll, als wäre sie direkt aufgefordert worden, eine Anfrage zu stellen, wenn eine Anfrage nicht autorisiert ist. Es ist ein wenig sinnlos, zwei von ihnen zu haben, da nur derjenige läuft, der näher an dem nicht autorisierten Ergebnis registriert ist (d. H. Derjenige, der später registriert wird). Es hängt wirklich von Ihrem spezifischen Anwendungsfall ab, welche Middleware standardmäßig verwendet werden sollte. * Normalerweise * OIDC ist die Standardeinstellung, da der Benutzer zum Anmeldeprovider weitergeleitet werden soll. – juunas