Bagikan melalui


Middleware OWIN dalam alur terintegrasi IIS

oleh Praburaj Thiagarajan, Rick Anderson

Artikel ini menunjukkan cara menjalankan Komponen middleware OWIN (OMC) di alur terintegrasi IIS, dan cara mengatur peristiwa alur yang dijalankan OMC. Anda harus meninjau Gambaran UmumDeteksi Kelas Startup Katana dan OWIN Proyek sebelum membaca tutorial ini. Tutorial ini ditulis oleh Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiagarajan, dan Howard Dierking ( @howard_dierking ).

Meskipun komponen middleware OWIN (OMC) terutama dirancang untuk berjalan dalam alur agnostik server, dimungkinkan untuk menjalankan OMC dalam alur terintegrasi IIS juga (mode klasik tidak didukung). OMC dapat dibuat untuk bekerja di alur terintegrasi IIS dengan menginstal paket berikut dari Package Manager Console (PMC):

Install-Package Microsoft.Owin.Host.SystemWeb

Ini berarti bahwa semua kerangka kerja aplikasi, bahkan yang belum dapat berjalan di luar IIS dan System.Web, dapat memperoleh manfaat dari komponen middleware OWIN yang ada.

Catatan

Microsoft.Owin.Security.* Semua paket yang dikirim dengan Sistem Identitas baru di Visual Studio 2013 (misalnya: Cookie, Akun Microsoft, Google, Facebook, Twitter, Token Pembawa, OAuth, Server otorisasi, JWT, direktori Aktif Azure, dan layanan federasi direktori aktif) ditulis sebagai OMC, dan dapat digunakan dalam skenario yang dihost sendiri dan dihosting IIS.

Cara OWIN Middleware Dijalankan di Alur Terintegrasi IIS

Untuk aplikasi konsol OWIN, alur aplikasi yang dibangun menggunakan konfigurasi startup diatur berdasarkan urutan komponen ditambahkan menggunakan IAppBuilder.Use metode . Artinya, alur OWIN dalam proses runtime Katana OMC dalam urutan terdaftar menggunakan IAppBuilder.Use. Dalam alur terintegrasi IIS, alur permintaan terdiri dari HttpModules yang berlangganan set peristiwa alur yang telah ditentukan sebelumnya seperti BeginRequest, AuthenticateRequest, AuthorizeRequest, dll. Perhatikan bahwa paket nuget Microsoft.Owin.Host.SystemWeb mendaftarkan OwinHttpModule. Biasanya, HttpModule terdaftar di IIS melalui Web.config file, tetapi Microsoft.Owin.Host.SystemWeb menggunakan fitur IIS yang disebut PreApplicationStartMethodAttribute dan HttpApplication.RegisterModule(Type) untuk mendaftarkan OwinHttpModule alur IIS secara dinamis.

Jika kita membandingkan OMC dengan HttpModule di dunia ASP.NET, OMC harus didaftarkan ke peristiwa alur yang telah ditentukan sebelumnya yang benar. Misalnya, HttpModule MyModule akan dipanggil ketika permintaan masuk ke tahap AuthenticateRequest dalam alur:

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

Agar OMC berpartisipasi dalam urutan eksekusi berbasis peristiwa yang sama ini, kode runtime Katana memindai melalui konfigurasi startup dan berlangganan masing-masing komponen middleware ke peristiwa alur terintegrasi. Misalnya, OMC dan kode pendaftaran berikut memungkinkan Anda melihat pendaftaran peristiwa default komponen middleware. (Untuk instruksi lebih rinci tentang membuat kelas startup OWIN, lihat Deteksi Kelas Startup OWIN.)

  1. Buat proyek aplikasi web kosong dan beri nama owin2.

  2. Dari Package Manager Console (PMC), jalankan perintah berikut:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. OWIN Startup Class Tambahkan dan beri Startupnama . Ganti kode yang dihasilkan dengan yang berikut (perubahan disorot):

    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. Tekan F5 untuk menjalankan aplikasi.

Konfigurasi Startup menyiapkan alur dengan tiga komponen middleware, dua pertama yang menampilkan informasi diagnostik dan yang terakhir merespons peristiwa (dan juga menampilkan informasi diagnostik). Metode PrintCurrentIntegratedPipelineStage ini menampilkan peristiwa alur terintegrasi yang dipanggil middleware ini dan pesan. Jendela output menampilkan hal berikut:

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

Runtime Katana memetakan masing-masing komponen middleware OWIN ke PreExecuteRequestHandler secara default, yang sesuai dengan peristiwa alur IIS PreRequestHandlerExecute.

Penanda Panggung

Anda dapat menandai OMC untuk dijalankan pada tahap alur tertentu dengan menggunakan IAppBuilder UseStageMarker() metode ekstensi. Untuk menjalankan sekumpulan komponen middleware selama tahap tertentu, sisipkan penanda tahap tepat setelah komponen terakhir adalah set selama pendaftaran. Ada aturan pada tahap alur mana Anda dapat menjalankan middleware dan komponen pesanan harus berjalan (Aturan dijelaskan nanti dalam tutorial). UseStageMarker Tambahkan metode ke kode seperti yang ditunjukkan Configuration di bawah ini:

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

Panggilan mengonfigurasi app.UseStageMarker(PipelineStage.Authenticate) semua komponen middleware yang terdaftar sebelumnya (dalam hal ini, dua komponen diagnostik kami) untuk berjalan pada tahap autentikasi alur. Komponen middleware terakhir (yang menampilkan diagnostik dan merespons permintaan) akan berjalan di ResolveCache panggung (peristiwa ResolveRequestCache ).

Tekan F5 untuk menjalankan aplikasi. Jendela output menunjukkan hal berikut:

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

Aturan Penanda Tahap

Komponen middleware Owin (OMC) dapat dikonfigurasi untuk dijalankan pada peristiwa tahap alur OWIN berikut:

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. Secara default, OMC berjalan pada peristiwa terakhir (PreHandlerExecute). Itulah sebabnya kode contoh pertama kami menampilkan "PreExecuteRequestHandler".

  2. Anda dapat menggunakan app.UseStageMarker metode untuk mendaftarkan OMC untuk dijalankan sebelumnya, pada setiap tahap alur OWIN yang tercantum dalam PipelineStage enum.

  3. Alur OWIN dan alur IIS diurutkan, oleh karena itu panggilan harus app.UseStageMarker berurutan. Anda tidak dapat mengatur penanganan aktivitas ke peristiwa yang mendahului peristiwa terakhir yang terdaftar ke app.UseStageMarker. Misalnya, setelah memanggil:

    app.UseStageMarker(PipelineStage.Authorize);
    

    panggilan untuk app.UseStageMarker lulus Authenticate atau PostAuthenticate tidak akan dihormati, dan tidak terkecuali akan dilemparkan. OMC berjalan pada tahap terbaru, yang secara default adalah PreHandlerExecute. Penanda panggung digunakan untuk membuatnya berjalan lebih awal. Jika Anda menentukan penanda tahap di luar urutan, kami membulatkan ke penanda sebelumnya. Dengan kata lain, menambahkan penanda panggung mengatakan "Jalankan tidak lebih lambat dari tahap X". OMC berjalan pada penanda tahap paling awal yang ditambahkan setelahnya di alur OWIN.

  4. Tahap awal panggilan untuk app.UseStageMarker menang. Misalnya, jika Anda mengalihkan urutan app.UseStageMarker panggilan dari contoh kami sebelumnya:

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

    Jendela output akan menampilkan:

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

    Semua OMC berjalan dalam AuthenticateRequest tahap, karena OMC terakhir yang terdaftar di acara, Authenticate dan peristiwa mendahului Authenticate semua peristiwa lainnya.