Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.)
Buat proyek aplikasi web kosong dan beri nama owin2.
Dari Package Manager Console (PMC), jalankan perintah berikut:
Install-Package Microsoft.Owin.Host.SystemWeb
OWIN Startup Class
Tambahkan dan beriStartup
nama . 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); } } }
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,
}
Secara default, OMC berjalan pada peristiwa terakhir (
PreHandlerExecute
). Itulah sebabnya kode contoh pertama kami menampilkan "PreExecuteRequestHandler".Anda dapat menggunakan
app.UseStageMarker
metode untuk mendaftarkan OMC untuk dijalankan sebelumnya, pada setiap tahap alur OWIN yang tercantum dalamPipelineStage
enum.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 keapp.UseStageMarker
. Misalnya, setelah memanggil:app.UseStageMarker(PipelineStage.Authorize);
panggilan untuk
app.UseStageMarker
lulusAuthenticate
atauPostAuthenticate
tidak akan dihormati, dan tidak terkecuali akan dilemparkan. OMC berjalan pada tahap terbaru, yang secara default adalahPreHandlerExecute
. 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.Tahap awal panggilan untuk
app.UseStageMarker
menang. Misalnya, jika Anda mengalihkan urutanapp.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 mendahuluiAuthenticate
semua peristiwa lainnya.