ASP.NET アプリケーション に対して モジュール化 された複雑な機能、処理を提供したい場合、 IHttpModule を利用すると便利です。 例えば、複数に分散してしまったアプリケーションに対して、ある決まった認証処理を実装させたいとき、簡単に機能を提供することが可能になります。 ここでは、認証されていないユーザーがアクセスしてきたとき、別のサイトへ転送させる機能を提供する HttpModule を作成します。
目次
概要
作成する HttpModule の機能は「認証されていないユーザーがアクセスしてきたとき、別のサイトへ転送させる機能」というものです。 以下は、上記機能提供する HttpModule の実態作成と、提供された HttpModule の利用方法 の 2部 構成になっています。
IHttpModule の 実装
IHttpModule
インターフェース では、void Init(HttpApplication)
と void Dispose()
を実装します。
基本的には HttpApplication
の イベントハンドラ に処理を追加することで動作させます。
以下のサンプルコードでは AuthenticateRequest
、EndRequest
の 2イベント を実装しています。
その他のイベント、イベント実行順は こちら にまとめてありますので、参考にしてください。
CustomHttpModule.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | namespace MvcApplication.Modules { using System; using System.Security.Principal; using System.Web; using System.Web.Security; public class CustomHttpModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.AuthenticateRequest += new EventHandler( this .onAuthenticateRequest); context.EndRequest += new EventHandler( this .onEndRequest); } private void onAuthenticateRequest( object sender, EventArgs e) { var application = (HttpApplication)sender; // 認証情報を格納した Cookie を取得 var authCookie = application.Request.Cookies[FormsAuthentication.FormsCookieName]; // Cookie が 存在する場合 if (authCookie != null && ! string .IsNullOrEmpty(authCookie.Value)) { // Cookie から 認証情報 を復元 var ticket = FormsAuthentication.Decrypt(authCookie.Value); var identity = new GenericIdentity(ticket.Name, "Single Sing-On" ); var pricinpal = new GenericPrincipal(identity, new string [] { }); HttpContext.Current.User = pricinpal; } } private void onEndRequest( object sender, EventArgs e) { var url = string .Empty; var application = (HttpApplication)sender; // 401:Unauthorized でない場合、何もしない if (application.Response.StatusCode != 401) { return ; } // リダイレクト用の URL を生成 url += "?ReturnUrl=" ; url += HttpUtility.UrlEncode(application.Request.Url.ToString()); // リダイレクト application.Response.Redirect(url); } } } |
onAuthenticateRequest
は「認証処理」なので、クッキー や セッション 、クエリパラメター等から アクセス してきた ユーザー を特定する処理を記述します。
ここで承認しょりまでは行いませんし、ましてやリダイレクト処理も記載しません。
onEndRequest
はすべての処理が完了したとき呼ばれる処理です。
この段階で StatusCode が 401 のとき、初めて承認されなかったことがわかります。
承認されなかった場合、今回はリダイレクトさせるようなコーディングを行っています。
もし仮に onAuthenticateRequest
において リダイレクト処理 を記載した場合、「一部のページは未認証でも利用できるようにする」ことができなくなります(未認証だと無条件でリダイレクトされてしまうため)。
これを利用できるようにするためには、上記のような実装が必要になります。
IHttpModule の 利用
実装した IHttpModule 実態クラス の利用は、 web.config へ記載で行います。 今回作成した IHttpModule の完全修飾名は MvcApplication.Modules.CustomHttpModule なので、この名前を type に記載します。
web.config(ASP.NET MVC3)
1 2 3 4 5 6 7 | < configuration > < system.web > < httpModules > < add name = "CustomHttpModule" type = "MvcApplication.Modules.CustomHttpModule" /> </ httpModules > </ system.web > </ configuration > |
web.config(ASP.NET MVC5)
1 2 3 4 5 6 7 | < configuration > < system.webServer > < modules runAllManagedModulesForAllRequests = "true" > < add name = "CustomHttpModule" type = "MvcApplication.Modules.CustomHttpModule" /> </ modules > </ system.webServer > </ configuration > |
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!