Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Creare un progetto di applicazione Web vuoto e denominarlo owin2.
Dalla console di Gestione pacchetti eseguire il comando seguente:
Install-Package Microsoft.Owin.Host.SystemWeb
Aggiungere un oggetto
OWIN Startup Class
e denominarloStartup
. 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); } } }
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,
}
Per impostazione predefinita, gli OMC vengono eseguiti all'ultimo evento (
PreHandlerExecute
). Ecco perché il primo codice di esempio visualizzato "PreExecuteRequestHandler".È possibile usare un
app.UseStageMarker
metodo per registrare un'OMC da eseguire in precedenza, in qualsiasi fase della pipeline OWIN elencata nell'enumerazionePipelineStage
.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 suapp.UseStageMarker
. Ad esempio, dopo aver chiamato:app.UseStageMarker(PipelineStage.Authorize);
chiamate al
app.UseStageMarker
passaggioAuthenticate
oPostAuthenticate
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.La prima fase delle chiamate a
app.UseStageMarker
vince. Ad esempio, se si cambia l'ordine delleapp.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'eventoAuthenticate
Authenticate
precede tutti gli altri eventi.