フォーム認証の概要 (C#)

作成者: Scott Mitchell

注意

この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは 、ASP.NET ID に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、ASP.NET ID プラットフォームを使用するようにアプリを更新することを強くお勧めします。 ASP.NET ID には、ASP.NET メンバーシップ システムに比して、次のような多くの利点があります。

  • パフォーマンスの向上
  • 拡張性とテスト容易性の向上
  • OAuth、OpenID Connect、および 2 要素認証のサポート
  • クレームベースの ID のサポート
  • ASP.Net Core との相互運用性の向上

コードのダウンロード または PDF のダウンロード

このチュートリアルでは、単なるディスカッションから実装に変わります。特に、フォーム認証の実装について説明します。 このチュートリアルで構築を開始する Web アプリケーションは、単純なフォーム認証からメンバーシップとロールに移行するため、後続のチュートリアルで引き続き構築されます。

このトピックの詳細については、次のビデオを参照してください: ASP.NET での基本フォーム認証の使用

はじめに

前の チュートリアル では、ASP.NET によって提供されるさまざまな認証、承認、およびユーザー アカウントのオプションについて説明しました。 このチュートリアルでは、単なるディスカッションから実装に変わります。特に、フォーム認証の実装について説明します。 このチュートリアルで構築を開始する Web アプリケーションは、単純なフォーム認証からメンバーシップとロールに移行するため、後続のチュートリアルで引き続き構築されます。

このチュートリアルでは、前のチュートリアルで説明したトピックであるフォーム認証ワークフローについて詳しく説明します。 その後、フォーム認証の概念をデモするための ASP.NET Web サイトを作成します。 次に、フォーム認証を使用するようにサイトを構成し、単純なログイン ページを作成し、ユーザーが認証されているかどうかをコードで確認する方法と、ユーザーがログインしたユーザー名を確認する方法を確認します。

フォーム認証ワークフローを理解し、Web アプリケーションで有効にし、ログイン ページとログオフ ページを作成することは、ユーザー アカウントをサポートし、Web ページを介してユーザーを認証する ASP.NET アプリケーションを構築する上で重要な手順です。 このため、これらのチュートリアルは互いに基づいているため、過去のプロジェクトでフォーム認証の構成を既に経験している場合でも、次のチュートリアルに進む前に、このチュートリアルを完全に実行することをお勧めします。

フォーム認証ワークフローについて

ASP.NET ランタイムは、ASP.NET ページや web サービスなどの ASP.NET リソースの要求 ASP.NET を処理すると、そのライフサイクル中に多数のイベントが発生します。 要求の最初と最後に発生するイベント、要求が認証および承認されるときに発生するイベント、未処理の例外の場合に発生するイベントなどがあります。 イベントの完全な一覧を表示するには、 HttpApplication オブジェクトのイベントを参照してください。

HTTP モジュール は、要求ライフサイクル内の特定のイベントに応答してコードが実行されるマネージド クラスです。 ASP.NET には、バックグラウンドで重要なタスクを実行する多数の HTTP モジュールが付属しています。 ディスカッションに特に関連する 2 つの組み込み HTTP モジュールは次のとおりです。

  • FormsAuthenticationModule – フォーム認証チケットを調べることでユーザーを認証します。これは通常、ユーザーの Cookie コレクションに含まれています。 フォーム認証チケットが存在しない場合、ユーザーは匿名になります。
  • UrlAuthorizationModule – 現在のユーザーが要求された URL へのアクセスを許可されているかどうかを判断します。 このモジュールでは、アプリケーションの構成ファイルで指定された承認規則を調べて、権限を決定します。 ASP.NET には、要求されたファイル ACL を調べて権限を決定する も含まれます FileAuthorizationModule

( FormsAuthenticationModuleFileAuthorizationModule) が実行される前に、ユーザーのUrlAuthorizationModule認証が試行されます。 要求を行っているユーザーが要求されたリソースへのアクセスを許可されていない場合、承認モジュールは要求を終了し、 HTTP 401 Unauthorized 状態を返します。 Windows 認証シナリオでは、HTTP 401 の状態がブラウザーに返されます。 この状態コードにより、ブラウザーはモーダル ダイアログ ボックスを使用してユーザーに資格情報の入力を求められます。 ただし、フォーム認証では、FormsAuthenticationModule によってこの状態が検出され、( HTTP 302 リダイレクト ステータスを介して) ユーザーをログイン ページにリダイレクトするように変更されるため、HTTP 401 Unauthorized 状態はブラウザーに送信されません。

ログイン ページの責任は、ユーザーの資格情報が有効かどうかを判断し、有効な場合はフォーム認証チケットを作成し、アクセスしようとしたページにユーザーをリダイレクトすることです。 認証チケットは、Web サイト上のページに対する後続の要求に含まれており、 は FormsAuthenticationModule ユーザーを識別するために使用します。

フォーム認証ワークフロー

図 1: フォーム認証ワークフロー

ページ訪問間での認証チケットの記憶

ログイン後、ユーザーがサイトを閲覧してもログインしたままになるように、フォーム認証チケットを各要求の Web サーバーに返送する必要があります。 これは通常、ユーザーの Cookie コレクションに認証チケットを配置することによって実現されます。 Cookie は、ユーザーのコンピューター上に存在し、各要求の HTTP ヘッダーで Cookie を作成した Web サイトに送信される小さなテキスト ファイルです。 したがって、フォーム認証チケットが作成され、ブラウザーの Cookie に格納されると、そのサイトにアクセスするたびに、要求と共に認証チケットが送信され、ユーザーが識別されます。

Cookie の 1 つの側面は、有効期限です。これは、ブラウザーが Cookie を破棄する日時です。 フォーム認証 Cookie の有効期限が切れると、ユーザーは認証されなくなり、匿名になります。 ユーザーがパブリック ターミナルからアクセスすると、ブラウザーを閉じるときに認証チケットの有効期限が切れる可能性があります。 ただし、自宅からアクセスする場合、同じユーザーは、サイトにアクセスするたびに再ログインする必要がないように、ブラウザーの再起動間で認証チケットを記憶する必要がある場合があります。 この決定は、多くの場合、ログイン ページの [記憶する] チェック ボックスの形式でユーザーによって行われます。 手順 3 では、ログイン ページで [記憶する] チェック ボックスを実装する方法について説明します。 次のチュートリアルでは、認証チケットのタイムアウト設定について詳しく説明します。

注意

Web サイトへのログオンに使用されたユーザー エージェントが Cookie をサポートしていない可能性があります。 このような場合、ASP.NET は cookieless フォーム認証チケットを使用できます。 このモードでは、認証チケットは URL にエンコードされます。 Cookieless 認証チケットを使用するタイミングと、次のチュートリアルで作成および管理する方法について説明します。

フォーム認証のスコープ

FormsAuthenticationModuleは、ASP.NET ランタイムの一部であるマネージド コードです。 Microsoft の インターネット インフォメーション サービス (IIS) Web サーバーのバージョン 7 より前は、IIS の HTTP パイプラインと ASP.NET ランタイムのパイプラインの間に明確な障壁がありました。 つまり、IIS 6 以前では、 FormsAuthenticationModule 要求が IIS から ASP.NET ランタイムに委任された場合にのみ実行されます。 既定では、IIS は静的コンテンツ自体 (HTML ページ、CSS、イメージ ファイルなど) を処理し、.aspx、.asmx、または .ashx の拡張子を持つページが要求された場合にのみ、ASP.NET ランタイムに要求を送信します。

ただし、IIS 7 では、統合された IIS パイプラインと ASP.NET パイプラインを使用できます。 いくつかの構成設定を使用すると、 すべての 要求に対して FormsAuthenticationModule を呼び出すように IIS 7 を設定できます。 さらに、IIS 7 では、任意の種類のファイルの URL 承認規則を定義できます。 詳細については、「 IIS6 と IIS7 セキュリティの間の変更」、「 Web プラットフォーム セキュリティ」、および「 IIS7 URL 承認について」を参照してください

簡単に言うと、IIS 7 より前のバージョンでは、フォーム認証のみを使用して、ASP.NET ランタイムによって処理されるリソースを保護できます。 同様に、URL 承認規則は、ASP.NET ランタイムによって処理されるリソースにのみ適用されます。 ただし、IIS 7 では、FormsAuthenticationModule と UrlAuthorizationModule を IIS の HTTP パイプラインに統合して、この機能をすべての要求に拡張することができます。

手順 1: このチュートリアル シリーズの ASP.NET Web サイトを作成する

可能な限り幅広い対象ユーザーに到達するために、このシリーズ全体で構築する ASP.NET Web サイトは、Microsoft の無料バージョンの Visual Studio 2008 Visual Web Developer 2008 で作成されます。 Microsoft SQL Server 2005 Express Edition データベースにユーザー ストアを実装SqlMembershipProviderします。 Visual Studio 2005 または Visual Studio 2008 またはSQL Serverの別のエディションを使用している場合は、心配しないでください。手順はほぼ同じになり、簡単ではない違いが指摘されます。

注意

各チュートリアルで使用されるデモ Web アプリケーションは、ダウンロードとして入手できます。 このダウンロード可能なアプリケーションは、.NET Framework バージョン 3.5 を対象とした Visual Web Developer 2008 で作成されました。 アプリケーションは .NET 3.5 を対象としているため、Web.config ファイルには 3.5 固有の追加の構成要素が含まれています。 簡単に言うと、コンピューターに .NET 3.5 をまだインストールしていない場合、最初に 3.5 固有のマークアップを Web.config から削除しないと、ダウンロード可能な Web アプリケーションは機能しません。

フォーム認証を構成する前に、まず ASP.NET Web サイトが必要です。 まず、新しいファイル システム ベースの ASP.NET Web サイトを作成します。 これを行うには、Visual Web Developer を起動し、[ファイル] メニューに移動し、[新しい Web サイト] を選択し、[新しい Web サイト] ダイアログ ボックスを表示します。 ASP.NET Web サイト テンプレートを選択し、[場所] ドロップダウン リストを [ファイル システム] に設定し、Web サイトを配置するフォルダーを選択して、言語を C# に設定します。 これにより、Default.aspx ASP.NET ページ、App_Data フォルダー、Web.config ファイルを含む新しい Web サイトが作成されます。

注意

Visual Studio では、Web サイト プロジェクトと Web アプリケーション プロジェクトの 2 つのモードのプロジェクト管理がサポートされています。 Web サイト プロジェクトにはプロジェクト ファイルがありませんが、Web アプリケーション プロジェクトは Visual Studio .NET 2002/2003 のプロジェクト アーキテクチャを模倣します。プロジェクト ファイルを含め、プロジェクトのソース コードを 1 つのアセンブリにコンパイルし、/bin フォルダーに配置します。 Visual Studio 2005 では最初は Web サイト プロジェクトのみがサポートされていましたが、Web アプリケーション プロジェクト モデルは Service Pack 1 で再導入されました。Visual Studio 2008 には、両方のプロジェクト モデルが用意されています。 ただし、Visual Web Developer 2005 および 2008 エディションでは、Web サイト プロジェクトのみがサポートされます。 Web サイト プロジェクト モデルを使用します。 Express 以外のエディションを使用していて、代わりに Web アプリケーション プロジェクト モデル を使用する場合は、自由に行うことができますが、画面に表示される内容と、表示されるスクリーン ショットと、これらのチュートリアルで提供されている手順に対して実行する必要がある手順に不一致がある可能性があることに注意してください。

Web サイト System-Based 新しいファイルを作成する

図 2: Web サイト System-Based 新しいファイルを作成する (クリックするとフルサイズの画像が表示されます)

マスター ページの追加

次に、Site.master という名前のルート ディレクトリ内のサイトに新しいマスター ページを追加します。 マスター ページ を使用すると、ページ開発者は、ASP.NET ページに適用できるサイト全体のテンプレートを定義できます。 マスター ページのメインの利点は、サイトの全体的な外観を 1 つの場所で定義できるため、サイトのレイアウトを簡単に更新または調整できることです。

Site.master という名前のマスター ページを Web サイトに追加する

図 3: Site.master という名前のマスター ページを Web サイトに追加する (クリックするとフルサイズの画像が表示されます)

マスター ページで、サイト全体のページ レイアウトを定義します。 デザイン ビューを使用して、必要なレイアウトコントロールや Web コントロールを追加することも、ソース ビューで手動でマークアップを手動で追加することもできます。 マスター ページのレイアウトを構造化して、 ASP.NET 2.0 チュートリアル シリーズのデータの操作で 使用されるレイアウトを模倣しました (図 4 を参照)。 マスター ページでは、ファイル Style.cssで定義されている CSS 設定 (このチュートリアルの関連ダウンロードに含まれています) を使用して、配置とスタイルに カスケード スタイル シート を使用します。 以下に示すマークアップからは見分けられませんが、CSS ルールは、ナビゲーション <div> のコンテンツが絶対に配置され、左側に表示され、200 ピクセルの固定幅になるように定義されています。

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Forms Authentication, Authorization, and User Accounts</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <div id="wrapper">
        <form id="form1" runat="server">
        
            <div id="header">
                <span class="title">User Account Tutorials</span>
            </div>
        
            <div id="content">
                <asp:contentplaceholder id="MainContent" runat="server">
                  <!-- Page-specific content will go here... -->
                </asp:contentplaceholder>
            </div>
            
            <div id="navigation">
                TODO: Menu will go here...
            </div>
        </form>
    </div>
</body>
</html>

マスター ページは、静的ページ レイアウトと、マスター ページを使用する ASP.NET ページで編集できる領域の両方を定義します。 これらのコンテンツ編集可能領域は、 コントロールによって ContentPlaceHolder 示され、コンテンツ <div> 内で表示できます。 マスター ページには 1 つの ContentPlaceHolder (MainContent) がありますが、マスター ページのには複数の ContentPlaceHolder が含まれる場合があります。

上にマークアップを入力すると、[デザイン] ビューに切り替えると、マスター ページのレイアウトが表示されます。 このマスター ページを使用する ASP.NET ページには、この均一なレイアウトがあり、リージョンのマークアップ MainContent を指定できます。

デザイン ビューで表示されるマスター ページ

図 4: デザイン ビューで表示されるマスター ページ (フルサイズの画像を表示する 場合)

コンテンツ ページの作成

この時点で、Web サイトにはDefault.aspx ページがありますが、先ほど作成したマスター ページは使用されません。 Web ページの宣言型マークアップを操作してマスター ページを使用することもできますが、ページにコンテンツがまだ含まれていない場合は、ページを削除してプロジェクトに再追加し、使用するマスター ページを指定する方が簡単です。 そのため、まずプロジェクトからDefault.aspxを削除します。

次に、ソリューション エクスプローラーでプロジェクト名を右クリックし、Default.aspxという名前の新しい Web フォームを追加することを選択します。 今回は、[マスター ページの選択] チェック ボックスをチェックし、一覧から [Site.master master] ページを選択します。

マスター ページの選択を選択して新しいDefault.aspx ページを追加する

図 5: マスター ページの選択を選択して新しいDefault.aspx ページを追加する (フルサイズの画像を表示する をクリックします)

Site.master マスター ページを使用する

図 6: Site.master マスター ページを使用する

注意

Web アプリケーション プロジェクト モデルを使用している場合は、[新しい項目の追加] ダイアログ ボックスに [マスター ページの選択] チェック ボックスは含まれません。 代わりに、"Web コンテンツ フォーム" 型の項目を追加する必要があります。[Web コンテンツ フォーム] オプションを選択し、[追加] をクリックすると、図 6 に示すのと同じ [マスターの選択] ダイアログ ボックスが表示されます。

新しいDefault.aspx ページの宣言型マークアップには、マスター ページ ファイルへのパスを指定するディレクティブと、マスター ページの MainContent ContentPlaceHolder の Content コントロールだけが @Page 含まれます。

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
</asp:Content>

ここでは、Default.aspx空のままにします。 このチュートリアルの後半で戻り、コンテンツを追加します。

注意

マスター ページには、メニューまたはその他のナビゲーション インターフェイスのセクションが含まれています。 このようなインターフェイスは、今後のチュートリアルで作成します。

手順 2: フォーム認証を有効にする

ASP.NET Web サイトを作成したら、次のタスクはフォーム認証を有効にすることです。 アプリケーションの認証構成は、Web.config の 要素を<authentication>使用して指定されます。要素には<authentication>、アプリケーションで使用される認証モデルを指定する mode という名前の 1 つの属性が含まれています。 この属性には、次の 4 つの値のいずれかを指定できます。

  • Windows – 前のチュートリアルで説明したように、アプリケーションがWindows 認証を使用する場合、訪問者を認証するのは Web サーバーの責任であり、これは通常、Basic、Digest、または Integrated Windows 認証を使用して行われます。
  • フォーム – ユーザーは Web ページ上のフォームを介して認証されます。
  • Passport – ユーザーは Microsoft の Passport Network を使用して認証されます。
  • なし – 認証モデルは使用されません。すべての訪問者は匿名です。

既定では、ASP.NET アプリケーションでは Windows 認証 が使用されます。 認証の種類をフォーム認証に変更するには、要素の mode 属性を <authentication> Forms に変更する必要があります。

プロジェクトに Web.config ファイルがまだ含まれていない場合は、ソリューション エクスプローラーでプロジェクト名を右クリックし、[新しい項目の追加] を選択して Web 構成ファイルを追加して、ファイルを追加します。

プロジェクトに Web.config がまだ含まれていない場合は、今すぐ追加します

図 7: プロジェクトにまだ Web.config が含まれていない場合は、[今すぐ追加] をクリックします (フルサイズの画像を表示する をクリックします)

次に、 要素を <authentication> 見つけて、フォーム認証を使用するように更新します。 この変更後、Web.config ファイルのマークアップは次のようになります。

<configuration>
    <system.web>
        ... Unrelated configuration settings and comments removed for brevity ...
        <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        -->
        <authentication mode="Forms" />
    </system.web>
</configuration>

注意

Web.config は XML ファイルであるため、大文字と小文字が重要です。 mode 属性を Forms に設定し、大文字が "F" になっていることを確認します。 "forms" などの別の大文字と小文字を使用する場合は、ブラウザーを使用してサイトにアクセスするときに構成エラーが発生します。

要素には <authentication> 、必要に応じて、 <forms> フォーム認証固有の設定を含む子要素を含めることができます。 ここでは、既定のフォーム認証設定のみを使用しましょう。 子要素については、次の <forms> チュートリアルで詳しく説明します。

手順 3: ログイン ページを作成する

フォーム認証をサポートするには、Web サイトにログイン ページが必要です。 「フォーム認証ワークフローについて」セクションで説明したように、 は、 FormsAuthenticationModule 表示が許可されていないページにアクセスしようとすると、ユーザーをログイン ページに自動的にリダイレクトします。 匿名ユーザーへのログイン ページへのリンクを表示する Web コントロール ASP.NET もあります。 これにより、「ログイン ページの URL は何ですか?」という質問が寄せられる。

既定では、フォーム認証システムでは、ログイン ページに Login.aspxという名前が付けられ、Web アプリケーションのルート ディレクトリに配置されます。 別のログイン ページ URL を使用する場合は、Web.config で指定します。これを行う方法については、後続のチュートリアルで説明します。

ログイン ページには、次の 3 つの役割があります。

  1. 訪問者が自分の資格情報を入力できるようにするインターフェイスを指定します。
  2. 送信された資格情報が有効かどうかを判断します。
  3. フォーム認証チケットを作成してユーザーを "ログイン" します。

ログイン ページのユーザー インターフェイスの作成

最初のタスクを開始しましょう。 Login.aspx という名前のサイトのルート ディレクトリに新しい ASP.NET ページを追加し、Site.master マスター ページに関連付けます。

Login.aspx という名前の新しい ASP.NET ページを追加する

図 8: Login.aspx という名前の新しい ASP.NET ページを追加する (フルサイズの画像を表示する をクリックします)

一般的なログイン ページ インターフェイスは、2 つのテキスト ボックス (1 つはユーザーの名前用、もう 1 つはパスワード用) とフォームを送信するためのボタンで構成されます。 Web サイトには、多くの場合、ブラウザーの再起動間で結果の認証チケットを保持する [記憶する] チェック ボックスが含まれています。

Login.aspxに 2 つの TextBox を追加し、それぞれのプロパティを ID UserName と Password に設定します。 また、Password の TextMode プロパティを Password に設定します。 次に、CheckBox コントロールを追加し、そのプロパティを ID RememberMe に設定し、そのプロパティを Text "Remember Me" に設定します。 その後、プロパティが "Login" に設定されている LoginButton Text という名前の Button を追加します。 最後に、Label Web コントロールを追加し、その ID プロパティを InvalidCredentialsMessage に設定し、その Text プロパティを "ユーザー名またはパスワードが無効です。 もう一度やり直してください。"、その ForeColor プロパティを Red に、その Visible プロパティを False に設定します。

この時点で、画面は図 9 のスクリーン ショットのようになります。ページの宣言型構文は次のようになります。

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
    <h1>
        Login</h1>
    <p>
        Username:
        <asp:TextBox ID="UserName" runat="server"></asp:TextBox></p>
    <p>
        Password:
        <asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox></p>
    <p>
        <asp:CheckBox ID="RememberMe" runat="server" Text="Remember Me" /> </p>
    <p>
        <asp:Button ID="LoginButton" runat="server" Text="Login" OnClick="LoginButton_Click" /> </p>
    <p>
        <asp:Label ID="InvalidCredentialsMessage" runat="server" ForeColor="Red" Text="Your username or password is invalid. Please try again."
            Visible="False"></asp:Label> </p>
</asp:Content>

ログイン ページには、2 つのテキスト ボックス、CheckBox、ボタン、およびラベルが含まれています

図 9: ログイン ページには、2 つのテキスト ボックス、CheckBox、ボタン、およびラベルが含まれています (フルサイズの画像を表示する をクリックします)。

最後に、LoginButton の Click イベントのイベント ハンドラーを作成します。 Designerから Button コントロールをダブルクリックするだけで、このイベント ハンドラーが作成されます。

指定された資格情報が有効かどうかを判断する

ここで、ボタンの Click イベント ハンドラーにタスク 2 を実装する必要があります。指定された資格情報が有効かどうかを判断します。 これを行うには、指定された資格情報が既知の資格情報と一致するかどうかを判断できるように、すべてのユーザーの資格情報を保持するユーザー ストアが必要です。

ASP.NET 2.0 より前のバージョンでは、開発者は、独自のユーザー ストアを実装し、指定された資格情報をストアに対して検証するコードを記述する責任がありました。 ほとんどの開発者は、ユーザー ストアをデータベースに実装し、UserName、Password、Email、LastLoginDate などの列を含む Users という名前のテーブルを作成します。 このテーブルは、ユーザー アカウントごとに 1 つのレコードを持つことになります。 ユーザーが指定した資格情報を確認するには、データベースに一致するユーザー名のクエリを実行し、データベース内のパスワードが指定されたパスワードに対応していることを確認する必要があります。

ASP.NET 2.0 では、開発者はメンバーシップ プロバイダーのいずれかを使用してユーザー ストアを管理する必要があります。 このチュートリアル シリーズでは、ユーザー ストアにSQL Server データベースを使用する SqlMembershipProvider を使用します。 SqlMembershipProvider を使用する場合は、プロバイダーが期待するテーブル、ビュー、ストアド プロシージャを含む特定のデータベース スキーマを実装する必要があります。 このスキーマを実装する方法については、SQL Serverのメンバーシップ スキーマの作成に関するチュートリアルを参照してください。 メンバーシップ プロバイダーを配置すると、ユーザーの資格情報の検証は、Membership クラスValidateUser(username, password) メソッドを呼び出すのと同じくらい簡単です。このメソッドは、ユーザー名パスワードの組み合わせの有効性を示すブール値を返します。 SqlMembershipProvider のユーザー ストアをまだ実装していないため、現時点では Membership クラスの ValidateUser メソッドを使用できません。

独自のカスタム Users データベース テーブル (SqlMembershipProvider を実装した後は廃止される) を作成する時間を取るのではなく、ログイン ページ自体内で有効な資格情報をハードコーディングしてみましょう。 LoginButton の Click イベント ハンドラーで、次のコードを追加します。

protected void LoginButton_Click(object sender, EventArgs e)
{
    // Three valid username/password pairs: Scott/password, Jisun/password, and Sam/password.
    string[] users = { "Scott", "Jisun", "Sam" };
    string[] passwords = { "password", "password", "password" };
    for (int i = 0; i < users.Length; i++)
    {
        bool validUsername = (string.Compare(UserName.Text, users[i], true) == 0);
        bool validPassword = (string.Compare(Password.Text, passwords[i], false) == 0);
        if (validUsername && validPassword)
        {
            // TODO: Log in the user...
            // TODO: Redirect them to the appropriate page
        }
    }
    // If we reach here, the user's credentials were invalid
    InvalidCredentialsMessage.Visible = true;
}

ご覧のように、Scott、Jisun、Sam の 3 つの有効なユーザー アカウントがあり、3 つとも同じパスワード ("password") を持っています。 このコードは、有効なユーザー名とパスワードの一致を探して、ユーザーとパスワードの配列をループ処理します。 ユーザー名とパスワードの両方が有効な場合は、ユーザーにログインし、適切なページにリダイレクトする必要があります。 資格情報が無効な場合は、InvalidCredentialsMessage Label が表示されます。

ユーザーが有効な資格情報を入力すると、"適切なページ" にリダイレクトされることを説明しました。しかし、適切なページは何ですか? ユーザーがページにアクセスしたときに、表示が承認されていない場合、FormsAuthenticationModule によって自動的にログイン ページにリダイレクトされることを思い出してください。 その際、ReturnUrl パラメーターを使用してクエリ文字列に要求された URL が含まれます。 つまり、ユーザーがProtectedPage.aspxにアクセスしようとしたときに、そのアクセスが許可されていない場合、FormsAuthenticationModule はユーザーを次のようにリダイレクトします。

Login.aspx。ReturnUrl=ProtectedPage.aspx

正常にログインすると、ユーザーはProtectedPage.aspxにリダイレクトされます。 または、ユーザーが自分の意思でログイン ページにアクセスすることもできます。 その場合は、ユーザーにログインした後、ルート フォルダーのDefault.aspx ページに送信する必要があります。

ユーザーのログイン

指定された資格情報が有効であると仮定すると、フォーム認証チケットを作成して、ユーザーをサイトにログインさせる必要があります。 System.Web.Security 名前空間FormsAuthentication クラスは、フォーム認証システムを介してユーザーをログインおよびログアウトするための各種メソッドを提供します。 FormsAuthentication クラスにはいくつかのメソッドがありますが、この段階で関心のある 3 つのメソッドは次のとおりです。

  • GetAuthCookie(username, persistCookie) – 指定された名前の ユーザー名のフォーム認証チケットを作成します。 次に、このメソッドは認証チケットの内容を保持する HttpCookie オブジェクトを作成して返します。 persistCookie が true の場合は、永続的な Cookie が作成されます。
  • SetAuthCookie(username, persistCookie) – GetAuthCookie(username, persistCookie) メソッドを呼び出してフォーム認証 Cookie を生成します。 次に、GetAuthCookie によって返される Cookie を Cookie コレクションに追加します (Cookie ベースのフォーム認証が使用されていると仮定します。それ以外の場合、このメソッドは Cookie レス チケット ロジックを処理する内部クラスを呼び出します)。
  • RedirectFromLoginPage(username, persistCookie) – このメソッドは SetAuthCookie(username, persistCookie) を呼び出し、ユーザーを適切なページにリダイレクトします。

GetAuthCookie は、Cookie を Cookie コレクションに書き込む前に認証チケットを変更する必要がある場合に便利です。 SetAuthCookie は、フォーム認証チケットを作成して Cookies コレクションに追加するが、ユーザーを適切なページにリダイレクトしたくない場合に便利です。 ログイン ページに保持するか、別のページに送信したい場合があります。

ユーザーにログインして適切なページにリダイレクトする必要があるため、RedirectFromLoginPage を使用しましょう。 LoginButton の Click イベント ハンドラーを更新し、コメントされた 2 つの TODO 行を次のコード行に置き換えます。

FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);

フォーム認証チケットを作成するときは、フォーム認証チケットの username パラメーターに UserName TextBox の Text プロパティを使用し、 persistCookie パラメーターの RememberMe CheckBox のチェック状態を使用します。

ログイン ページをテストするには、ブラウザーでログイン ページにアクセスします。 まず、"Nope" のユーザー名やパスワードが "間違っている" など、無効な資格情報を入力します。 [ログイン] ボタンをクリックするとポストバックが発生し、InvalidCredentialsMessage Label が表示されます。

無効な資格情報を入力すると InvalidCredentialsMessage ラベルが表示される

図 10: 無効な資格情報を入力すると InvalidCredentialsMessage ラベルが表示される (フルサイズの画像を表示する をクリックします)

次に、有効な資格情報を入力し、[ログイン] ボタンをクリックします。 ポストバックが発生すると、フォーム認証チケットが作成され、自動的にDefault.aspxにリダイレクトされます。 この時点で、Web サイトにログインしましたが、現在ログインしていることを示す視覚的な手掛かりはありません。 手順 4 では、ユーザーがログインしているかどうかをプログラムで判断する方法と、ページにアクセスするユーザーを識別する方法について説明します。

手順 5 では、ユーザーを Web サイトからログアウトする方法について説明します。

ログイン ページのセキュリティ保護

ユーザーが自分の資格情報を入力してログイン ページ フォームを送信すると、資格情報 (パスワードを含む) がインターネット経由で プレーン テキストで Web サーバーに送信されます。 つまり、ネットワーク トラフィックをスニッフィングするすべてのハッカーは、ユーザー名とパスワードを確認できます。 これを防ぐには、 Secure Socket Layers (SSL) を使用してネットワーク トラフィックを暗号化することが不可欠です。 これにより、資格情報 (およびページ全体の HTML マークアップ) が、ブラウザーを離れた時点から Web サーバーによって受信されるまで暗号化されます。

Web サイトに機密情報が含まれている場合を除き、ログイン ページと、ユーザーのパスワードがプレーン テキストでネットワーク経由で送信される他のページでのみ SSL を使用する必要があります。 フォーム認証チケットは既定で暗号化され、デジタル署名されているため(改ざんを防ぐために)、フォーム認証チケットのセキュリティ保護について心配する必要はありません。 フォーム認証チケットのセキュリティに関する詳細な説明については、次のチュートリアルで説明します。

注意

多くの金融および医療 Web サイトは、認証されたユーザーがアクセス できるすべての ページで SSL を使用するように構成されています。 このような Web サイトを構築している場合は、フォーム認証チケットがセキュリティで保護された接続経由でのみ送信されるようにフォーム認証システムを構成できます。

手順 4: 認証済みの訪問者を検出し、その ID を決定する

この時点でフォーム認証を有効にし、基本的なログイン ページを作成しましたが、ユーザーが認証されているか匿名であるかを判断する方法はまだ調べていません。 特定のシナリオでは、認証されたユーザーまたは匿名ユーザーがページにアクセスしているかどうかに応じて、異なるデータまたは情報を表示したい場合があります。 さらに、多くの場合、認証されたユーザーの ID を把握する必要があります。

これらの手法を説明するために、既存のDefault.aspx ページを拡張してみましょう。 Default.aspxで、AuthenticatedMessagePanel という名前の 2 つの Panel コントロールと AnonymousMessagePanel という名前のコントロールを追加します。 最初のパネルに WelcomeBackMessage という名前の Label コントロールを追加します。 2 番目のパネルで HyperLink コントロールを追加し、Text プロパティを "Log In" に設定し、NavigateUrl プロパティを "~/Login.aspx" に設定します。 この時点で、Default.aspxの宣言型マークアップは次のようになります。

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
    <asp:Panel runat="server" ID="AuthenticatedMessagePanel">
        <asp:Label runat="server" ID="WelcomeBackMessage"></asp:Label>
    </asp:Panel>
    
    <asp:Panel runat="Server" ID="AnonymousMessagePanel">
        <asp:HyperLink runat="server" ID="lnkLogin" Text="Log In" NavigateUrl="~/Login.aspx"></asp:HyperLink>
    </asp:Panel>
</asp:Content>

あなたが今推測したように、ここでのアイデアは認証された訪問者に AuthenticatedMessagePanel だけを表示し、匿名の訪問者には AnonymousMessagePanel だけを表示することです。 これを実現するには、ユーザーがログインしているかどうかに応じて、これらのパネルの表示プロパティを設定する必要があります。

Request.IsAuthenticated プロパティは、要求が認証されているかどうかを示すブール値を返します。 Page_Load イベント ハンドラー コードに次のコードを入力します。

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.IsAuthenticated)
    {
        WelcomeBackMessage.Text = "Welcome back!";
    
        AuthenticatedMessagePanel.Visible = true;
        AnonymousMessagePanel.Visible = false;
    }
    else
    {
        AuthenticatedMessagePanel.Visible = false;
        AnonymousMessagePanel.Visible = true;
    }
}

このコードを配置した状態で、ブラウザーからDefault.aspxにアクセスします。 まだログインしていないと仮定すると、ログイン ページへのリンクが表示されます (図 11 を参照)。 このリンクをクリックし、サイトにログインします。 手順 3 で説明したように、資格情報を入力するとDefault.aspxに戻りますが、今度はページに "ようこそ" というメッセージが表示されます (図 12 を参照)。

匿名でアクセスすると、ログイン リンクが表示されます

図 11: 匿名でアクセスすると、ログイン リンクが表示される

認証されたユーザーが表示されます。

図 12: 認証されたユーザーが "ようこそ" と表示されるメッセージ

HttpContext オブジェクトUser プロパティを使用して、現在ログオンしているユーザーの ID を確認できます。 HttpContext オブジェクトは現在の要求に関する情報を表し、Response、Request、Session などの一般的な ASP.NET オブジェクトのホームです。 User プロパティは、現在の HTTP 要求のセキュリティ コンテキストを表し、 IPrincipal インターフェイスを実装します。

User プロパティは、FormsAuthenticationModule によって設定されます。 具体的には、FormsAuthenticationModule が受信要求でフォーム認証チケットを見つけると、新しい GenericPrincipal オブジェクトが作成され、User プロパティに割り当てられます。

プリンシパル オブジェクト (GenericPrincipal など) は、ユーザーの ID と、ユーザーが属するロールに関する情報を提供します。 IPrincipal インターフェイスは、次の 2 つのメンバーを定義します。

次のコードを使用して、現在の訪問者の名前を確認できます。

string currentUsersName = User.Identity.Name;

フォーム認証を使用すると、GenericPrincipal の Identity プロパティに対して FormsIdentity オブジェクト が作成されます。 FormsIdentity クラスは、AuthenticationType プロパティの文字列 "Forms" を常に返し、IsAuthenticated プロパティの場合は true を返します。 Name プロパティは、フォーム認証チケットの作成時に指定されたユーザー名を返します。 これら 3 つのプロパティに加えて、FormsIdentity には 、Ticket プロパティを使用して基になる認証チケットへのアクセスが含まれます。 Ticket プロパティは、Expiration、IsPersistent、IssueDate、Name などのプロパティを持つ FormsAuthenticationTicket 型のオブジェクトを返します。

ここで重要な点は、FormsAuthentication.GetAuthCookie(username, persistCookie)、FormsAuthentication.SetAuthCookie(username, persistCookie)、および FormsAuthentication.RedirectFromLoginPage(username, persistCookie) メソッドで指定された username パラメーターが、User.Identity.Name によって返される値と同じであるという点です。 さらに、これらのメソッドによって作成された認証チケットは、User.Identity を FormsIdentity オブジェクトにキャストし、Ticket プロパティにアクセスすることで使用できます。

FormsIdentity ident = User.Identity as FormsIdentity;
FormsAuthenticationTicket authTicket = ident.Ticket;

Default.aspxで、よりパーソナライズされたメッセージを提供しましょう。 WelcomeBackMessage Label の Text プロパティに "Welcome Back, username!" という文字列が割り当てることができるように、Page_Load イベント ハンドラーを更新 します

WelcomeBackMessage.Text = "Welcome Back, " + User.Identity.Name + "!";

図 13 は、この変更の効果を示しています (ユーザー Scott としてログインする場合)。

ウェルカム メッセージには、現在ログインしているユーザーの名前が含まれます

図 13: ウェルカム メッセージには、現在ログインしているユーザーの名前が含まれています

LoginView コントロールと LoginName コントロールの使用

認証されたユーザーと匿名ユーザーに異なるコンテンツを表示することは一般的な要件です。では、現在ログオンしているユーザーの名前が表示されます。 そのため、ASP.NET には、図 13 に示すのと同じ機能を提供する 2 つの Web コントロールが含まれていますが、1 行のコードを記述する必要はありません。

LoginView コントロールは、認証されたユーザーと匿名ユーザーにさまざまなデータを簡単に表示できるようにするテンプレート ベースの Web コントロールです。 LoginView には、次の 2 つの定義済みテンプレートが含まれています。

  • AnonymousTemplate – このテンプレートに追加されたマークアップは、匿名の訪問者にのみ表示されます。
  • LoggedInTemplate – このテンプレートのマークアップは、認証されたユーザーにのみ表示されます。

サイトのマスター ページ Site.master に LoginView コントロールを追加しましょう。 ただし、LoginView コントロールだけを追加するのではなく、新しい ContentPlaceHolder コントロールの両方を追加し、その新しい ContentPlaceHolder 内に LoginView コントロールを配置しましょう。 この決定の根拠はまもなく明らかになるでしょう。

注意

AnonymousTemplate と LoggedInTemplate に加えて、LoginView コントロールにはロール固有のテンプレートを含めることができます。 ロール固有のテンプレートは、指定されたロールに属するユーザーにのみマークアップを表示します。 今後のチュートリアルでは、LoginView コントロールのロールベースの機能について説明します。

まず、LoginContent という名前の ContentPlaceHolder をナビゲーション <div> 要素内のマスター ページに追加します。 [ツールボックス] から [ソース] ビューに ContentPlaceHolder コントロールをドラッグするだけで、結果のマークアップを "TODO: Menu will go here..." の上に配置できます。テキスト。

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

次に、LoginContent ContentPlaceHolder 内に LoginView コントロールを追加します。 マスター ページの ContentPlaceHolder コントロールに配置されたコンテンツは、ContentPlaceHolder の 既定のコンテンツ と見なされます。 つまり、このマスター ページ ASP.NET 使用するページでは、ContentPlaceHolder ごとに独自のコンテンツを指定することも、マスター ページの既定のコンテンツを使用することもできます。

LoginView およびその他のログイン関連のコントロールは、ツールボックスの [ログイン] タブにあります。

ツールボックスの LoginView コントロール

図 14: ツールボックスの LoginView コントロール

次に、LoginView コントロールの直後に 2 つの <br/> 要素を追加しますが、ContentPlaceHolder 内にまだ追加します。 この時点で、ナビゲーション <div> 要素のマークアップは次のようになります。

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
        <asp:LoginView ID="LoginView1" runat="server">
        </asp:LoginView>
        <br /><br />
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

LoginView のテンプレートは、Designerまたは宣言型マークアップから定義できます。 Visual Studio のDesignerから、LoginView のスマート タグを展開します。このタグには、構成されたテンプレートがドロップダウン リストに一覧表示されます。 AnonymousTemplate にテキスト "Hello, stranger" を入力します。次に、HyperLink コントロールを追加し、Text プロパティと NavigateUrl プロパティをそれぞれ "Log In" と "~/Login.aspx" に設定します。

AnonymousTemplate を構成した後、LoggedInTemplate に切り替えて、"Welcome back, " というテキストを入力します。 次に、LoginName コントロールをツールボックスから LoggedInTemplate にドラッグし、"Welcome back, " テキストの直後に配置します。 LoginName コントロールの名前が示すように、現在ログインしているユーザーの名前が表示されます。 内部的には、LoginName コントロールは単に User.Identity.Name プロパティを出力します

LoginView のテンプレートにこれらの追加を行った後、マークアップは次のようになります。

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
        <asp:LoginView ID="LoginView1" runat="server">
            <LoggedInTemplate>
                Welcome back,
                <asp:LoginName ID="LoginName1" runat="server" />.
            </LoggedInTemplate>
            <AnonymousTemplate>
                Hello, stranger.
                <asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
            </AnonymousTemplate>
        </asp:LoginView>
        
        <br /><br />
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

この Site.master マスター ページへの追加により、ユーザーが認証されているかどうかに応じて、Web サイトの各ページに異なるメッセージが表示されます。 図 15 は、ユーザー Jisun がブラウザーを介してアクセスしたときのDefault.aspx ページを示しています。 "ようこそ、Jisun" メッセージが 2 回繰り返されます。左側のマスター ページのナビゲーション セクション (先ほど追加した LoginView コントロールを使用) と、Default.aspxのコンテンツ領域 (パネル コントロールとプログラム ロジックを使用) で 1 回繰り返されます。

LoginView コントロールが表示される

図 15: LoginView コントロールに "ようこそ、Jisun" と表示されます。

マスター ページに LoginView を追加したため、サイトのすべてのページに表示できます。 ただし、このメッセージを表示したくない Web ページがある場合があります。 そのようなページの 1 つはログイン ページです。これは、ログイン ページへのリンクが場所が外れているように見えるのでです。 マスター ページの ContentPlaceHolder に LoginView コントロールを配置したので、この既定のマークアップをコンテンツ ページでオーバーライドできます。 Login.aspxを開き、Designerに移動します。 マスター ページの LoginContent ContentPlaceHolder のLogin.aspxで Content コントロールを明示的に定義していないため、ログイン ページには、この ContentPlaceHolder のマスター ページの既定のマークアップが表示されます。 これは、Designerを通じて確認できます。LoginContent ContentPlaceHolder には既定のマークアップ (LoginView コントロール) が表示されます。

[ログイン] ページには、マスター ページの LoginContent ContentPlaceHolder の既定のコンテンツが表示されます

図 16: [ログイン] ページには、マスター ページの LoginContent ContentPlaceHolder の既定のコンテンツが表示されます (フルサイズの画像を表示する場合はクリックします)

LoginContent ContentPlaceHolder の既定のマークアップをオーバーライドするには、Designerの領域を右クリックし、コンテキスト メニューから [カスタム コンテンツの作成] オプションを選択するだけです。 (Visual Studio 2008 を使用する場合、ContentPlaceHolder にはスマート タグが含まれています。このタグを選択すると、同じオプションが提供されます)。これにより、ページのマークアップに新しいコンテンツ コントロールが追加されるため、このページのカスタム コンテンツを定義できます。 "ログインしてください..." などのカスタム メッセージをここに追加することもできますが、このメッセージは空白のままにしておきます。

注意

Visual Studio 2005 では、カスタム コンテンツを作成すると、ASP.NET ページに空のコンテンツ コントロールが作成されます。 ただし、Visual Studio 2008 では、カスタム コンテンツを作成すると、マスター ページの既定のコンテンツが新しく作成されたコンテンツ コントロールにコピーされます。 Visual Studio 2008 を使用している場合は、新しいコンテンツ コントロールを作成した後、マスター ページからコピーされたコンテンツをクリアしてください。

図 17 は、この変更を行った後にブラウザーからアクセスしたときのLogin.aspx ページを示しています。 Default.aspxにアクセスするときと同様に、左側のナビゲーション <div> に "Hello, stranger" または "Welcome Back, username" というメッセージがないことに注意してください。

[ログイン] ページでは、既定の LoginContent ContentPlaceHolder のマークアップが非表示になります

図 17: ログイン ページが既定の LoginContent ContentPlaceHolder のマークアップを非表示にする (フルサイズの画像を表示する をクリックします)

手順 5: ログアウトする

手順 3 では、ユーザーをサイトにログインするためのログイン ページの作成を確認しましたが、ユーザーをログアウトする方法はまだ確認されていません。FormsAuthentication クラスには、ユーザーをログインさせるメソッドに加えて 、SignOut メソッドも用意されています。 SignOut メソッドは、フォーム認証チケットを破棄するだけで、ユーザーをサイトからログアウトします。

ログアウト リンクの提供は、ASP.NET ユーザーをログアウトするように特別に設計されたコントロールを含む一般的な機能です。 LoginStatus コントロール には、ユーザーの認証状態に応じて、"Login" LinkButton または "Logout" LinkButton が表示されます。 "Login" LinkButton は匿名ユーザーに対してレンダリングされますが、認証されたユーザーには "Logout" LinkButton が表示されます。 "Login" および "Logout" LinkButtons のテキストは、LoginStatus の LoginText プロパティと LogoutText プロパティを使用して構成できます。

"Login" LinkButton をクリックするとポストバックが発生し、そこからログイン ページにリダイレクトが発行されます。 "ログアウト" LinkButton をクリックすると、LoginStatus コントロールが FormsAuthentication.SignOff メソッドを呼び出し、ユーザーをページにリダイレクトします。 ログオフしたユーザーがリダイレクトされるページは、LogoutAction プロパティに依存します。これは、次の 3 つの値のいずれかに割り当てることができます。

  • 更新 – 既定値。は、ユーザーがアクセスしたばかりのページにリダイレクトします。 アクセスしたばかりのページで匿名ユーザーが許可されていない場合、FormsAuthenticationModule によってユーザーがログイン ページに自動的にリダイレクトされます。

リダイレクトがここで実行される理由について興味があるかもしれません。 ユーザーが同じページに留めたい場合、明示的なリダイレクトが必要なのはなぜですか? その理由は、"Logoff" LinkButton がクリックされても、ユーザーは Cookie コレクションにフォーム認証チケットをまだ持っているためです。 その結果、ポストバック要求は認証された要求になります。 LoginStatus コントロールは SignOut メソッドを呼び出しますが、これは FormsAuthenticationModule がユーザーを認証した後に行われます。 したがって、明示的なリダイレクトにより、ブラウザーはページを再要求します。 ブラウザーがページを再要求する頃には、フォーム認証チケットが削除されているため、受信要求は匿名になります。

  • Redirect – ユーザーは LoginStatus の LogoutPageUrl プロパティで指定された URL にリダイレクトされます。
  • RedirectToLoginPage – ユーザーはログイン ページにリダイレクトされます。

LoginStatus コントロールをマスター ページに追加し、[リダイレクト] オプションを使用して、サインアウトされたことを確認するメッセージを表示するページにユーザーを送信するように構成しましょう。まず、Logout.aspx という名前のルート ディレクトリにページを作成します。 このページを Site.master マスター ページに関連付けるのを忘れないでください。 次に、ページのマークアップに、ログアウトされたことをユーザーに説明するメッセージを入力します。

次に、Site.master マスター ページに戻り、LoginContent ContentPlaceHolder の LoginView の下に LoginStatus コントロールを追加します。 LoginStatus コントロールの LogoutAction プロパティを Redirect に設定し、LogoutPageUrl プロパティを "~/Logout.aspx" に設定します。

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
        <asp:LoginView ID="LoginView1" runat="server">
            <LoggedInTemplate>
                Welcome back,
                <asp:LoginName ID="LoginName1" runat="server" />.
            </LoggedInTemplate>
            <AnonymousTemplate>
                Hello, stranger.
                <asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
            </AnonymousTemplate>
        </asp:LoginView>
        <br />
        <asp:LoginStatus ID="LoginStatus1" runat="server" LogoutAction="Redirect" LogoutPageUrl="~/Logout.aspx" />
        
        <br /><br />
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

LoginStatus は LoginView コントロールの外部にあるため、匿名ユーザーと認証済みユーザーの両方に対して表示されますが、LoginStatus では "Login" または "Logout" LinkButton が正しく表示されるため、問題ありません。 LoginStatus コントロールを追加すると、AnonymousTemplate の "ログイン" HyperLink は余分であるため、削除します。

図 18 は、Jisun が訪れたときのDefault.aspxを示しています。 左側の列には、"Welcome Back, Jisun" というメッセージと、ログアウトするためのリンクが表示されることに注意してください。ログアウト LinkButton をクリックすると、ポストバックが発生し、Jisun がシステムからサインアウトし、Logout.aspxにリダイレクトされます。 図 19 に示すように、Jisun がLogout.aspxに達するまでに、彼女は既にサインアウトされているため、匿名になっています。 その結果、左側の列には、"ようこそ、見知らぬ人" というテキストとログイン ページへのリンクが表示されます。

Default.aspxショー

図 18: Default.aspxは、"Welcome Back, Jisun" と "Logout" LinkButton を示しています (フルサイズの画像を表示するにはクリックします)

Logout.aspxショー

図 19: Logout.aspxは、"ようこそ、見知らぬ人" と "ログイン" LinkButton を示しています (フルサイズの画像を表示する をクリックします)

注意

マスター ページの LoginContent ContentPlaceHolder を非表示にするには、Logout.aspx ページをカスタマイズすることをお勧めします (手順 4 のLogin.aspxの場合と同様)。 その理由は、LoginStatus コントロールによってレンダリングされる "Login" LinkButton ("Hello, stranger" の下にあるコントロール) は、ReturnUrl クエリ文字列パラメーターで現在の URL を渡してログイン ページにユーザーを送信するためです。 つまり、ログアウトしたユーザーがこの LoginStatus の "Login" LinkButton をクリックし、ログインすると、Logout.aspxにリダイレクトされ、ユーザーが簡単に混乱する可能性があります。

まとめ

このチュートリアルでは、フォーム認証ワークフローの調査から始め、ASP.NET アプリケーションでのフォーム認証の実装に取り組みます。 フォーム認証は、フォーム認証チケットに基づいてユーザーを識別し、承認されていないユーザーをログイン ページにリダイレクトするという 2 つの責任を持つ FormsAuthenticationModule を利用します。

.NET Frameworkの FormsAuthentication クラスには、フォーム認証チケットを作成、検査、および削除するためのメソッドが含まれています。 Request.IsAuthenticated プロパティと User オブジェクトは、要求が認証されているかどうかを判断するためのプログラムによる追加のサポートと、ユーザーの ID に関する情報を提供します。 LoginView、LoginStatus、および LoginName Web コントロールもあります。これにより、開発者は、多くの一般的なログイン関連タスクを簡単にコード不要で実行できます。 今後のチュートリアルでは、これらおよびその他のログイン関連の Web コントロールについて詳しく説明します。

このチュートリアルでは、フォーム認証の概要について説明しました。 構成オプションの並べ替え、Cookie レス フォーム認証チケットの動作の確認、フォーム認証チケットの内容 ASP.NET 保護する方法については説明しませんでした。

幸せなプログラミング!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。

このチュートリアルに含まれるトピックに関するビデオ トレーニング

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスmitchell@4GuysFromRolla.comすることも、ブログを介して アクセスすることもできます。これは でhttp://ScottOnWriting.NET確認できます。

特別な感謝...

このチュートリアル シリーズは、多くの役立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、このチュートリアル シリーズは多くの役立つレビュー担当者によってレビューされました。 このチュートリアルのリード レビュー担当者には、Alicja Maziarz、John Suru、Toria Murphy が含まれます。 今後の MSDN 記事の確認に関心がありますか? その場合は、 に行mitchell@4GuysFromRolla.comをドロップしてください。