.NET TIPS

[ASP.NET]フォーム認証後に強制的に先頭ページへ誘導するには?

山田 祥寛
2004/06/18

 Webアプリケーションを設計する際に、悩ましいポイントの1つとしてよくいわれるのが「HTTPプロトコルがステートレスである」点だ。サーバはクライアントからのリクエストを受け付け、何らかの処理を行った後、その結果をレスポンスとしてクライアントに送信する。これがHTTPプロトコルによる一連の処理のすべてであり、次に発生するリクエストは、もはや直前のリクエストとは何ら関係のない独立した処理なのである。

 そのため、ASP.NETでもアプリケーションの「状態(ステート)」を管理するために、セッションやビューステートなど、さまざまな技法を凝らしているのは、読者諸兄もよくご存じのことであろう。

 しかし、これらASP.NET標準の仕組みが、必ずしもWebアプリケーションの問題をすべて解決する「銀の弾丸」というわけではない。

 例えば、画面A→画面B→画面Cという順をたどって処理を進めていく「ウィザード形式」の構成は、Webアプリケーションの世界でもよく見掛ける方式であるが、このような構成のアプリケーションで、もしもユーザーが途中の画面Bに直接ブックマークを設定(お気に入りに追加)してしまったとしたらどうだろう。

 本来ならば、画面Bは画面Aで何かしらの処理が済んでいるのを前提として動いているが、画面Bに直接アクセスしてしまったことで、アプリケーションが予期せぬ動作をすることは大いにあり得る。よしんば見掛け上は正常に動作しているようでも、整合性のないデータがデータベースに格納されてしまうことで、その後の処理に致命的な影響を及ぼす可能性もある。

 このように、連続性を持った画面構成のアプリケーションを構築する場合、一般ユーザーによる「途中画面への直接アクセス」をシステム的にガードしておくことは、大変重要だ。

 そこで本稿では、フォーム認証時に、ユーザーから要求されたページにリダイレクトするのではなく、必ずアプリケーションの先頭ページにリダイレクトするための手法を紹介することにしよう。なお、基本的なフォーム認証の環境設定については、別稿「TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?」の内容に従うものとする。

 まず、今回紹介する手法を利用したサンプル・プログラムを示す。

<%@ Page ContentType="text/html" Language="VB" %>
<script runat="Server">
Sub objBtn_Click(sender As Object, e As EventArgs)
  If FormsAuthentication.Authenticate(txtUsr.Text,txtPass.Text) Then
    FormsAuthentication.SetAuthCookie(txtUsr.Text, False)
    Response.Redirect("/netIns/auth/sample.aspx")
  Else
    objLbl.Text="正しいユーザーID、パスワードを入力してください"
  End If
End Sub
</script>
<html>
<head>
<title>フォーム認証ログイン</title>
</head>
<body>
<form runat="Server">
<center>
<h1>フォーム認証ログイン</h1>
<hr />
<b>ユーザーID:</b>
<asp:TextBox id="txtUsr" runat="Server" Columns="12" /><br />
<b>パスワード:</b>
<asp:TextBox id="txtPass" runat="Server" Columns="11" TextMode="Password" />
<br />
<asp:Button id="objBtn" runat="Server" Text="ログイン" OnClick="objBtn_Click" /><br />
<asp:Label id="objLbl" runat="Server" ForeColor="Red" />
</center>
</form>
</body>
</html>
先頭ページに強制的にリダイレクトするVB.NETのログイン・ページ(login_redirect_vb.aspx)
 
<%@ Page ContentType="text/html" Language="C#" %>
<script runat="Server">
void objBtn_Click(Object sender, EventArgs e) {
  if(FormsAuthentication.Authenticate(txtUsr.Text,txtPass.Text)){
    FormsAuthentication.SetAuthCookie(txtUsr.Text,false);
    Response.Redirect("/netIns/auth/sample.aspx");
  }else{
    objLbl.Text="正しいユーザーID、パスワードを入力してください";
  }
}
</script>
<html>
<head>
<title>フォーム認証ログイン</title>
</head>
<body>
<form runat="Server">
<center>
<h1>フォーム認証ログイン</h1>
<hr />
<b>ユーザーID:</b>
<asp:TextBox id="txtUsr" runat="Server" Columns="12" /><br />
<b>パスワード:</b>
<asp:TextBox id="txtPass" runat="Server" Columns="11" TextMode="Password" />
<br />
<asp:Button id="objBtn" runat="Server" Text="ログイン" OnClick="objBtn_Click" /><br />
<asp:Label id="objLbl" runat="Server" ForeColor="Red" />
</center>
</form>
</body>
</html>
先頭ページに強制的にリダイレクトするC#のログイン・ページ(login_redirect_cs.aspx)

 単純に要求されたページを表示するだけならば、別稿「TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?」でも紹介したように、認証の可否を判定した後に単純にFormsAuthenticationクラス(System.Web.Security名前空間)のRedirectFromLoginPageメソッドを実行すればよい。これによって、認証クッキー(チケット)が発行されると同時に、クライアントが本来要求したページに対してリダイレクトが行われる。

 しかし、今回の場合はクライアントが要求したURLにかかわらず、強制的にあらかじめ決められた先頭ページ(本稿の例ではsample.aspx)にリダイレクトしたいわけなので、RedirectFromLoginPageメソッドは使用することができない。その代わりとして、標準的なリダイレクト処理を実現するResponse.Redirectメソッドを利用する必要があるというわけだ。しかし、当然のことながら、この場合、RedirectFromLoginPageメソッドでは意識する必要がなかった認証クッキーの発行を自らの手で行う必要がある。

 そこで登場するのが、FormsAuthenticationクラスのSetAuthCookieメソッドなのである。SetAuthCookieメソッドを利用することで、認証済みユーザーの情報をレスポンスにセットすることができる。第1パラメータにはクッキーに保存するユーザー名を、第2パラメータにはクッキーを永続化するかどうかを示すブール値を指定する。

 これによって、アプリケーション内のいかなるページにアクセスしようとも、必ずコード内で指定された先頭ページ(本稿の例ではsample.aspx)にリダイレクトされる。End of Article

カテゴリ:Webフォーム 処理対象:認証
使用ライブラリ:FormsAuthenticationクラス(System.Web.Security名前空間)
関連TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]途中ページへの直接アクセスを防ぐには?
[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
[ASP.NET AJAX]クライアントサイド・スクリプトからカスタムの認証機能を利用するには?
[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには?
[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間