Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.Use
registriert 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 OwinHttpModule
registriert.
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.)
Erstellen Sie ein leeres Webanwendungsprojekt, und nennen Sie es owin2.
Führen Sie in der Paket-Manager-Konsole (PMC) den folgenden Befehl aus:
Install-Package Microsoft.Owin.Host.SystemWeb
Fügen Sie ein hinzu
OWIN Startup Class
, und nennen Sie ihnStartup
. 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); } } }
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,
}
OmCs werden standardmäßig beim letzten Ereignis (
PreHandlerExecute
) ausgeführt. Aus diesem Grund wurde in unserem ersten Beispielcode "PreExecuteRequestHandler" angezeigt.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 derPipelineStage
Enumeration aufgeführt ist.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 istapp.UseStageMarker
. Beispielsweise nach dem Aufruf:app.UseStageMarker(PipelineStage.Authorize);
Aufrufe zum
app.UseStageMarker
ÜbergebenAuthenticate
oderPostAuthenticate
werden nicht berücksichtigt, und es wird keine Ausnahme ausgelöst. OMCs werden in der letzten Phase ausgeführt, die standardmäßig lautetPreHandlerExecute
. 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.Die früheste Phase von Aufrufen von
app.UseStageMarker
Gewinnen. Wenn Sie beispielsweise die Reihenfolge derapp.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, dieAuthenticate
beim Ereignis registriert wurde, und dasAuthenticate
Ereignis allen anderen Ereignissen vorangeht.