ASP.NET アプリケーション に対して モジュール化 された複雑な機能、処理を提供したい場合、 IHttpModule を利用すると便利です。 例えば、複数に分散してしまったアプリケーションに対して、ある決まった認証処理を実装させたいとき、簡単に機能を提供することが可能になります。 ここでは、認証されていないユーザーがアクセスしてきたとき、別のサイトへ転送させる機能を提供する HttpModule を作成します。
目次
概要
作成する HttpModule の機能は「認証されていないユーザーがアクセスしてきたとき、別のサイトへ転送させる機能」というものです。 以下は、上記機能提供する HttpModule の実態作成と、提供された HttpModule の利用方法 の 2部 構成になっています。
IHttpModule の 実装
IHttpModule
インターフェース では、void Init(HttpApplication)
と void Dispose()
を実装します。
基本的には HttpApplication
の イベントハンドラ に処理を追加することで動作させます。
以下のサンプルコードでは AuthenticateRequest
、EndRequest
の 2イベント を実装しています。
その他のイベント、イベント実行順は こちら にまとめてありますので、参考にしてください。
CustomHttpModule.cs
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 += "http://localhost:8080/Account/Login"; 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)
<configuration> <system.web> <httpModules> <add name="CustomHttpModule" type="MvcApplication.Modules.CustomHttpModule" /> </httpModules> </system.web> </configuration>
web.config(ASP.NET MVC5)
<configuration> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="CustomHttpModule" type="MvcApplication.Modules.CustomHttpModule"/> </modules> </system.webServer> </configuration>
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!