Freigeben über


OWIN Middleware in der integrierten IIS-Pipeline

von Praburaj Thiagarajan, Rick Anderson

In diesem Artikel erfahren Sie, wie Sie OWIN-Middlewarekomponenten (OMCs) in der integrierten IIS-Pipeline ausführen und das Pipelineereignis festlegen, auf dem eine OMC ausgeführt wird. Lesen Sie eine Übersicht über die Erkennung von Projekt Katana - und OWIN-Startklassen, bevor Sie dieses Tutorial lesen. Dieses Tutorial wurde von Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiagarajan und Howard Dierking ( @howard_dierking ) geschrieben.

Obwohl OWIN-Middlewarekomponenten ( OMCs ) in erster Linie für die Ausführung in einer serverunabhängigen Pipeline konzipiert sind, ist es möglich, eine OMC auch in der integrierten IIS-Pipeline auszuführen (der klassische Modus wird nicht unterstützt). Eine OMC kann in der integrierten IIS-Pipeline verwendet werden, indem Sie das folgende Paket über die Paket-Manager-Konsole (PMC) installieren:

Install-Package Microsoft.Owin.Host.SystemWeb

Dies bedeutet, dass alle Anwendungsframeworks, auch solche, die noch nicht außerhalb von IIS und System.Web ausgeführt werden können, von vorhandenen OWIN-Middlewarekomponenten profitieren können.

Hinweis

Alle Pakete, die Microsoft.Owin.Security.* mit dem neuen Identity System in Visual Studio 2013 (z. B. Cookies, Microsoft-Konto, Google, Facebook, Twitter, Bearer Token, OAuth, Autorisierungsserver, JWT, Azure Active Directory und Active Directory-Verbunddienste) werden als OMCs erstellt und können sowohl in selbstgehosteten als auch in IIS-gehosteten Szenarien verwendet werden.

Ausführung der OWIN-Middleware in der integrierten IIS-Pipeline

Bei OWIN-Konsolenanwendungen wird die Anwendungspipeline, die mithilfe der Startkonfiguration erstellt wurde, durch die Reihenfolge festgelegt, in der die Komponenten mithilfe der IAppBuilder.Use -Methode hinzugefügt werden. Das heißt, die OWIN-Pipeline in der Katana-Runtime verarbeitet OMCs in der Reihenfolge, in der sie mit IAppBuilder.Useregistriert wurden. In der integrierten IIS-Pipeline besteht die Anforderungspipeline aus HttpModules , die einen vordefinierten Satz von Pipelineereignissen wie BeginRequest, AuthenticateRequest, AuthorizeRequest usw. abonniert haben. Beachten Sie, dass das Nuget-Paket Microsoft.Owin.Host.SystemWeb den OwinHttpModuleregistriert. HttpModule Wird in der Regel in IIS über Web.config eine Datei registriert, aber Microsoft.Owin.Host.SystemWeb verwenden Sie ein IIS-Feature namens PreApplicationStartMethodAttribute undHttpApplication.RegisterModule(Type), um die OwinHttpModule Pipeline dynamisch in IIS zu registrieren.

Wenn wir eine OMC mit der eines HttpModule in der ASP.NET Welt vergleichen, muss ein OMC für das richtige vordefinierte Pipelineereignis registriert werden. Das HttpModule MyModule wird beispielsweise aufgerufen, wenn eine Anforderung an die AuthenticateRequest-Phase in der Pipeline kommt:

public class MyModule : IHttpModule
{
    public void Dispose()
    {
        //clean-up code here.
    }
    public void Init(HttpApplication context)
    {
        // An example of how you can handle AuthenticateRequest events.
        context.AuthenticateRequest += ctx_AuthRequest;
    }
    void ctx_AuthRequest(object sender, EventArgs e)
    {
        // Handle event.
    }
}

Damit ein OMC an derselben ereignisbasierten Ausführungsreihenfolge teilnimmt, überprüft der Katana-Runtimecode die Startkonfiguration und abonniert jede Middlewarekomponenten einem integrierten Pipelineereignis. Mit dem folgenden OMC- und Registrierungscode können Sie beispielsweise die Standardereignisregistrierung von Middlewarekomponenten anzeigen. (Ausführlichere Anweisungen zum Erstellen einer OWIN-Startklasse finden Sie unter OWIN-Startklassenerkennung.)

  1. Erstellen Sie ein leeres Webanwendungsprojekt, und nennen Sie es owin2.

  2. Führen Sie in der Paket-Manager-Konsole (PMC) den folgenden Befehl aus:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. Fügen Sie ein hinzu OWIN Startup Class , und nennen Sie ihn Startup. Ersetzen Sie den generierten Code durch Folgendes (die Änderungen sind hervorgehoben):

    using System;
    using System.Threading.Tasks;
    using Microsoft.Owin;
    using Owin;
    using System.Web;
    using System.IO;
    using Microsoft.Owin.Extensions;
    [assembly: OwinStartup(typeof(owin2.Startup))]
    namespace owin2
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.Use((context, next) =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
                    return next.Invoke();
                });
                app.Use((context, next) =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "2nd MW");
                    return next.Invoke();
                }); 
                app.Run(context =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "3rd MW");
                    return context.Response.WriteAsync("Hello world");
                });            
            }
            private void PrintCurrentIntegratedPipelineStage(IOwinContext context, string msg)
            {
                var currentIntegratedpipelineStage = HttpContext.Current.CurrentNotification;
                context.Get<TextWriter>("host.TraceOutput").WriteLine(
                    "Current IIS event: " + currentIntegratedpipelineStage
                    + " Msg: " + msg);
            }
        }
    }
    
  4. Drücken Sie F5, um die App auszuführen.

Die Startkonfiguration richtet eine Pipeline mit drei Middlewarekomponenten ein, wobei die ersten beiden Diagnoseinformationen und die letzte auf Ereignisse reagiert (und auch Diagnoseinformationen anzeigt). Die PrintCurrentIntegratedPipelineStage -Methode zeigt das integrierte Pipelineereignis, für das diese Middleware aufgerufen wird, und eine Meldung an. In den Ausgabefenstern wird Folgendes angezeigt:

Current IIS event: PreExecuteRequestHandler Msg: Middleware 1
Current IIS event: PreExecuteRequestHandler Msg: 2nd MW
Current IIS event: PreExecuteRequestHandler Msg: 3rd MW

Die Katana-Runtime hat standardmäßig jede der OWIN-Middlewarekomponenten PreExecuteRequestHandler zugeordnet, was dem IIS-Pipelineereignis PreRequestHandlerExecute entspricht.

Phasenmarkierungen

Sie können OMCs markieren, die in bestimmten Phasen der Pipeline ausgeführt werden sollen, indem Sie die IAppBuilder UseStageMarker() Erweiterungsmethode verwenden. Um einen Satz von Middlewarekomponenten während einer bestimmten Phase auszuführen, fügen Sie einen Stufenmarker direkt nach der letzten Komponente ein, die während der Registrierung festgelegt ist. Es gibt Regeln, für welche Phase der Pipeline Sie Middleware ausführen können, und die Auftragskomponenten müssen ausgeführt werden (Die Regeln werden weiter unten im Tutorial erläutert). Fügen Sie die UseStageMarker -Methode wie unten gezeigt dem Configuration Code hinzu:

public void Configuration(IAppBuilder app)
{
    app.Use((context, next) =>
    {
        PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
        return next.Invoke();
    });
    app.Use((context, next) =>
    {
        PrintCurrentIntegratedPipelineStage(context, "2nd MW");
        return next.Invoke();
    });
    app.UseStageMarker(PipelineStage.Authenticate);
    app.Run(context =>
    {
        PrintCurrentIntegratedPipelineStage(context, "3rd MW");
        return context.Response.WriteAsync("Hello world");
    });
    app.UseStageMarker(PipelineStage.ResolveCache);
}

Mit app.UseStageMarker(PipelineStage.Authenticate) dem Aufruf werden alle zuvor registrierten Middlewarekomponenten (in diesem Fall unsere beiden Diagnosekomponenten) für die Ausführung in der Authentifizierungsphase der Pipeline konfiguriert. Die letzte Middlewarekomponente (die Diagnose anzeigt und auf Anforderungen antwortet) wird auf der ResolveCache Phase (das ResolveRequestCache-Ereignis) ausgeführt.

Drücken Sie F5, um die App auszuführen. Im Ausgabefenster wird Folgendes angezeigt:

Current IIS event: AuthenticateRequest Msg: Middleware 1
Current IIS event: AuthenticateRequest Msg: 2nd MW
Current IIS event: ResolveRequestCache Msg: 3rd MW

Regeln für Phasenmarkierungen

Owin Middleware Components (OMC) kann für die Ausführung bei den folgenden Ereignissen der OWIN-Pipelinephase konfiguriert werden:

public enum PipelineStage
{
    Authenticate = 0,
    PostAuthenticate = 1,
    Authorize = 2,
    PostAuthorize = 3,
    ResolveCache = 4,
    PostResolveCache = 5,
    MapHandler = 6,
    PostMapHandler = 7,
    AcquireState = 8,
    PostAcquireState = 9,
    PreHandlerExecute = 10,
}
  1. OmCs werden standardmäßig beim letzten Ereignis (PreHandlerExecute) ausgeführt. Aus diesem Grund wurde in unserem ersten Beispielcode "PreExecuteRequestHandler" angezeigt.

  2. Sie können die a-Methode app.UseStageMarker verwenden, um eine OMC für die Frühere Ausführung zu registrieren, in jeder Phase der OWIN-Pipeline, die in der PipelineStage Enumeration aufgeführt ist.

  3. Die OWIN-Pipeline und die IIS-Pipeline sind sortiert, daher müssen Aufrufe von app.UseStageMarker in ordnung sein. Sie können den Ereignishandler nicht auf ein Ereignis festlegen, das dem letzten ereignis vorangestellt ist, das bei registriert ist app.UseStageMarker. Beispielsweise nach dem Aufruf:

    app.UseStageMarker(PipelineStage.Authorize);
    

    Aufrufe zum app.UseStageMarker Übergeben Authenticate oder PostAuthenticate werden nicht berücksichtigt, und es wird keine Ausnahme ausgelöst. OMCs werden in der letzten Phase ausgeführt, die standardmäßig lautet PreHandlerExecute. Die Phasenmarker werden verwendet, damit sie früher ausgeführt werden können. Wenn Sie Phasenmarkierungen in der ungeordneten Reihenfolge angeben, werden wir auf den vorherigen Marker umrundet. Anders ausgedrückt: Beim Hinzufügen einer Phasenmarkierung heißt es "Nicht später als Phase X ausführen". OMC wird am frühesten Zeitpunkt ausgeführt, der in der OWIN-Pipeline nach ihnen hinzugefügt wurde.

  4. Die früheste Phase von Aufrufen von app.UseStageMarker Gewinnen. Wenn Sie beispielsweise die Reihenfolge der app.UseStageMarker Aufrufe aus unserem vorherigen Beispiel ändern:

    public void Configuration(IAppBuilder app)
    {
        app.Use((context, next) =>
        {
            PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
            return next.Invoke();
        });
        app.Use((context, next) =>
        {
            PrintCurrentIntegratedPipelineStage(context, "2nd MW");
            return next.Invoke();
        });
        app.UseStageMarker(PipelineStage.ResolveCache);
        app.Run(context =>
        {
            PrintCurrentIntegratedPipelineStage(context, "3rd MW");
            return context.Response.WriteAsync("Hello world");
        });
        app.UseStageMarker(PipelineStage.Authenticate);
    }
    

    Das Ausgabefenster wird angezeigt:

    Current IIS event: AuthenticateRequest Msg: Middleware 1
    Current IIS event: AuthenticateRequest Msg: 2nd MW
    Current IIS event: AuthenticateRequest Msg: 3rd MW
    

    Die OMCs werden alle in der AuthenticateRequest Phase ausgeführt, da die letzte OMC, die Authenticate beim Ereignis registriert wurde, und das Authenticate Ereignis allen anderen Ereignissen vorangeht.