Condividi tramite


Middleware OWIN nella pipeline integrata IIS

di Praburaj Thiajan, Rick Anderson

Questo articolo illustra come eseguire i componenti middleware OWIN (OMC) nella pipeline integrata IIS e come impostare l'evento della pipeline su cui viene eseguito un OMC. Prima di leggere questa esercitazione, vedere Panoramica del rilevamento delle classi di avvio di Project Katana e OWIN . Questa esercitazione è stata scritta da Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiajan e Howard Dierking ( @howard_dierking ).

Anche se i componenti middleware OWIN sono progettati principalmente per l'esecuzione in una pipeline indipendente dal server, è possibile eseguire anche un OMC nella pipeline integrata IIS (la modalità classica non è supportata). Un'OMC può essere eseguita per funzionare nella pipeline integrata IIS installando il pacchetto seguente dalla Console di Gestione pacchetti:An OMC can be made to work in the IIS integrated pipeline by installing the following package package from the Package Manager Console (PMC):

Install-Package Microsoft.Owin.Host.SystemWeb

Ciò significa che tutti i framework applicazione, anche quelli che non sono ancora in grado di eseguire all'esterno di IIS e System.Web, possono trarre vantaggio dai componenti middleware OWIN esistenti.

Nota

Microsoft.Owin.Security.* Tutti i pacchetti inviati con il nuovo sistema di gestione delle identità in Visual Studio 2013 (ad esempio, cookie, account Microsoft, Google, Facebook, Twitter, Bearer Token, OAuth, server di autorizzazione, JWT, Azure Active Directory e Servizi federativo active directory) vengono creati come OMC e possono essere usati sia in scenari self-hosted che ospitati in IIS.

Modalità di esecuzione del middleware OWIN nella pipeline integrata IIS

Per le applicazioni console OWIN, la pipeline dell'applicazione compilata usando la configurazione di avvio viene impostata in base all'ordine in cui i componenti vengono aggiunti usando il IAppBuilder.Use metodo . Ovvero, la pipeline OWIN nel runtime Katana elabora gli OMC nell'ordine in cui sono stati registrati usando IAppBuilder.Use. Nella pipeline integrata IIS la pipeline di richiesta è costituita da HttpModules sottoscritti a un set predefinito di eventi della pipeline, ad esempio BeginRequest, AuthenticateRequest, AuthorizeRequest e così via. Si noti che il pacchetto NuGet Microsoft.Owin.Host.SystemWeb registra .OwinHttpModule In genere, HttpModule viene registrato in IIS tramite Web.config file, ma Microsoft.Owin.Host.SystemWeb usare una funzionalità IIS denominata PreApplicationStartMethodAttribute e HttpApplication.RegisterModule(Type) per registrare dinamicamente nella OwinHttpModule pipeline IIS.

Se si confronta un OMC con quello di un Oggetto HttpModule nel mondo ASP.NET, è necessario registrare un'OMC con l'evento pipeline predefinito corretto. Ad esempio, HttpModule MyModule viene richiamato quando una richiesta arriva alla fase AuthenticateRequest nella pipeline:

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.
    }
}

Affinché un OMC partecipi a questo stesso ordinamento di esecuzione basato su eventi, il codice di runtime Katana analizza la configurazione di avvio e sottoscrive ognuno dei componenti middleware a un evento della pipeline integrata. Ad esempio, il codice OMC e di registrazione seguente consente di visualizzare la registrazione degli eventi predefinita dei componenti middleware. Per istruzioni più dettagliate sulla creazione di una classe di avvio OWIN, vedere Rilevamento classi di avvio OWIN.

  1. Creare un progetto di applicazione Web vuoto e denominarlo owin2.

  2. Dalla console di Gestione pacchetti eseguire il comando seguente:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. Aggiungere un oggetto OWIN Startup Class e denominarlo Startup. Sostituire il codice generato con il codice seguente (le modifiche sono evidenziate):

    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. Premere F5 per eseguire l'app.

La configurazione di avvio configura una pipeline con tre componenti middleware, le prime due che visualizzano le informazioni di diagnostica e l'ultima che risponde agli eventi e visualizza anche le informazioni di diagnostica. Il PrintCurrentIntegratedPipelineStage metodo visualizza l'evento della pipeline integrata su cui viene richiamato questo middleware e un messaggio. Le finestre di output visualizzano quanto segue:

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

Il runtime katana ha eseguito il mapping di ognuno dei componenti middleware OWIN a PreExecuteRequestHandler per impostazione predefinita, che corrisponde all'evento della pipeline IIS PreRequestHandlerExecute.

Indicatori di fase

È possibile contrassegnare gli OMC da eseguire in fasi specifiche della pipeline usando il IAppBuilder UseStageMarker() metodo di estensione. Per eseguire un set di componenti middleware durante una determinata fase, inserire un marcatore di fase subito dopo che l'ultimo componente è il set durante la registrazione. Esistono regole in quale fase della pipeline è possibile eseguire il middleware e i componenti dell'ordine devono essere eseguiti (le regole sono illustrate più avanti nell'esercitazione). Aggiungere il UseStageMarker metodo al Configuration codice come illustrato di seguito:

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

La app.UseStageMarker(PipelineStage.Authenticate) chiamata configura tutti i componenti middleware registrati in precedenza (in questo caso i due componenti di diagnostica) da eseguire nella fase di autenticazione della pipeline. L'ultimo componente middleware (che visualizza la diagnostica e risponde alle richieste) verrà eseguito nella ResolveCache fase (evento ResolveRequestCache ).

Premere F5 per eseguire l'app. La finestra di output mostra quanto segue:

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

Regole indicatore di fase

I componenti middleware Owin (OMC) possono essere configurati per l'esecuzione nei seguenti eventi della fase della pipeline OWIN:

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. Per impostazione predefinita, gli OMC vengono eseguiti all'ultimo evento (PreHandlerExecute). Ecco perché il primo codice di esempio visualizzato "PreExecuteRequestHandler".

  2. È possibile usare un app.UseStageMarker metodo per registrare un'OMC da eseguire in precedenza, in qualsiasi fase della pipeline OWIN elencata nell'enumerazione PipelineStage .

  3. La pipeline OWIN e la pipeline IIS sono ordinate, pertanto le chiamate a app.UseStageMarker devono essere in ordine. Non è possibile impostare il gestore eventi su un evento che precede l'ultimo evento registrato con su app.UseStageMarker. Ad esempio, dopo aver chiamato:

    app.UseStageMarker(PipelineStage.Authorize);
    

    chiamate al app.UseStageMarker passaggio Authenticate o PostAuthenticate non verranno rispettate e non verrà generata alcuna eccezione. Gli OMC vengono eseguiti nella fase più recente, che per impostazione predefinita è PreHandlerExecute. I marcatori di fase vengono usati per renderli eseguiti in precedenza. Se si specificano marcatori di fase non in ordine, viene eseguito l'arrotondamento al marcatore precedente. In altre parole, l'aggiunta di un indicatore di fase indica "Esegui non più tardi della fase X". L'esecuzione dell'OMC al primo marcatore di fase aggiunto dopo di esse nella pipeline OWIN.

  4. La prima fase delle chiamate a app.UseStageMarker vince. Ad esempio, se si cambia l'ordine delle app.UseStageMarker chiamate dall'esempio precedente:

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

    Verrà visualizzata la finestra di output:

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

    Tutti gli OMCs vengono eseguiti nella AuthenticateRequest fase, perché l'ultimo OMC registrato con l'evento e l'evento AuthenticateAuthenticate precede tutti gli altri eventi.