C#.NET を使用して ASP.NET アプリケーションでフォーム ベースの認証を実装する方法

文書翻訳 文書翻訳
文書番号: 301240 - 対象製品
この記事は、以前は次の ID で公開されていました: JP301240
すべて展開する | すべて折りたたむ

目次

概要

この資料では、データベースを使用してユーザーを格納することにより、フォーム ベースの認証を実装する方法について説明します。

必要条件

推奨されるハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack の概要は、次のとおりです。
  • Microsoft Visual Studio .NET
  • Microsoft インターネット インフォメーション サービス (IIS) 5.0 以降
  • Microsoft SQL Server

C# .NET による ASP.NET アプリケーションの作成

  1. Visual Studio .NET を起動します。
  2. 新しい ASP.NET Web アプリケーションを作成し、名前と保存先の場所を指定します。

Web.config ファイルによるセキュリティ設定の構成

ここでは、<authentication> と <authorization> の各構成セクションを追加および編集し、フォーム ベースの認証を使用するように ASP.NET アプリケーションを構成する方法について説明します。
  1. ソリューション エクスプローラーで Web.config ファイルを開きます。
  2. 認証モードを Forms に変更します。
  3. <Forms> タグを挿入し、適切な属性を設定します。これらの属性の詳細については、「関連資料」に記載されている MSDN ドキュメントまたは QuickStart ドキュメントを参照してください。次のコードをコピーし、[編集] メニューの [HTML として貼り付け] をクリックして、ファイルの <authentication> セクションに貼り付けます。
    <authentication mode="Forms">
    <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
    protection="All" path="/" timeout="30" />
    </authentication> 
    					
  4. 次のように、<authorization> セクションで匿名ユーザーのアクセスを拒否します。
    <authorization>
    <deny users ="?" />
    <allow users = "*" />
    </authorization>
    					

ユーザーの詳細を格納するサンプル データベースの作成

ここでは、ユーザー名、パスワード、およびユーザーのロールを格納するサンプル データベースの作成方法について説明します。ユーザーのロールをデータベースに保存してロールベースのセキュリティを実装する場合は、ロール列を作成する必要があります。
  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックし、「notepad」と入力して、メモ帳を開きます。
  2. 次の SQL スクリプト コードを選択して右クリックし、[コピー] をクリックします。メモ帳で [編集] メニューの [貼り付け] をクリックし、コピーしたコードを貼り付けます。
    if exists (select * from sysobjects where id = 
    object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Users]
    GO
    CREATE TABLE [dbo].[Users] (
    [uname] [varchar] (15) NOT NULL ,
    [Pwd] [varchar] (25) NOT NULL ,
    [userRole] [varchar] (25) NOT NULL ,
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
    CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 
       (
    [uname]
    )  ON [PRIMARY] 
    GO
    
    INSERT INTO Users values('user1','user1','Manager')
    INSERT INTO Users values('user2','user2','Admin')
    INSERT INTO Users values('user3','user3','User')
    GO
    					
  3. ファイルを Users.sql という名前で保存します。
  4. Microsoft SQL Server コンピューターで、クエリ アナライザーを使用して Users.sql を開きます。データベースの一覧から [pubs] をクリックし、スクリプトを実行します。これにより、サンプル ユーザー テーブルが作成され、このサンプル アプリケーションで使用される Pubs データベースに追加されます。

Logon.aspx ページの作成

  1. Logon.aspx という名前の新しい Web フォームをプロジェクトに追加します。
  2. Logon.aspx ページをエディターで開き、HTML ビューに切り替えます。
  3. 次のコードをコピーし、[編集] メニューの [HTML として貼り付け] をクリックして、コピーしたコードを <form> タグの間に挿入します。
    <h3>
    <font face="Verdana">Logon Page</font>
    </h3>
    <table>
    <tr>
    <td>Email:</td>
    <td><input id="txtUserName" type="text" runat="server"></td>
    <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
    Display="Static" ErrorMessage="*" runat="server" 
    ID="vUserName" /></td>
    </tr>
    <tr>
    <td>Password:</td>
    <td><input id="txtUserPass" type="password" runat="server"></td>
    <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
    Display="Static" ErrorMessage="*" runat="server" 
    ID="vUserPass" />
    </td>
    </tr>
    <tr>
    <td>Persistent Cookie:</td>
    <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>
    <td></td>
    </tr>
    </table>
    <input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
    <asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />
    						
    この Web フォームは、ユーザーにログオン フォームを表示するために使用します。アプリケーションにログオンするためのユーザー名とパスワードは、このフォームに入力されます。
  4. デザイン ビューに切り替えてページを保存します。

ユーザー資格情報を検証するイベント ハンドラーのコーディング

ここでは、コード ビハインド ページ (Logon.aspx.cs) に配置するコードの例を紹介します。
  1. [Logon] をダブルクリックして、Logon.aspx.cs ファイルを開きます。
  2. コード ビハインド ファイルに必要な名前空間をインポートします。
    using System.Data.SqlClient;
    using System.Web.Security;
    					
  3. データベースを調べてユーザー資格情報を検証する ValidateUser 関数を作成します (接続文字列の部分は、使用しているデータベースを指定するように変更してください)。
    private bool ValidateUser( string userName, string passWord )
    {
    	SqlConnection conn;
    	SqlCommand cmd;
    	string lookupPassword = null;
    
    	// 無効な userName を確認する。
    	// userName は null 以外で 1 〜 15 文字にする必要がある。
    	if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
    		return false;
    	}
    
    	// 無効な passWord を確認する。
    	// passWord は null 以外で 1 〜 25 文字にする必要がある。
    	if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
    		return false;
    	}
    
    	try
    	{
    		// ローカル SQL Server に接続するために使用する適切な接続文字列
    		// については、SQL Server 管理者に問い合わせる。
    		conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
    		conn.Open();
    
    		// 指定した userName で users テーブルから pwd フィールドを選択する SqlCommand を作成する。
    		cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
    		cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
    		cmd.Parameters["@userName"].Value = userName;
    
    		// コマンドを実行し、pwd フィールドを lookupPassword 文字列内に取得する。
    		lookupPassword = (string) cmd.ExecuteScalar();
    
    		// コマンドと接続オブジェクトをクリーンアップする。
    		cmd.Dispose();
    		conn.Dispose();
    	}
    	catch ( Exception ex )
    	{
    		// デバッグのためのエラー処理をここに追加する。
    		// このエラー メッセージは呼び出し元に返さないようにする。
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
    	}
    
    	// パスワードが見つからない場合は false を返す。
    	if ( null == lookupPassword ) 
    	{
    		// セキュリティを強化するためにここで失敗したログインの試行をイベント ログに記述することができる。
    		return false;
    	}
    
    	// 大文字と小文字を区別し、lookupPassword と入力の passWord を比較する。
    	return ( 0 == string.Compare( lookupPassword, passWord, false ) );
    
    }
    					
  4. cmdLogin_ServerClick イベントでは、フォーム認証 Cookie を生成し、ユーザーを適切なページにリダイレクトします。そのために使用できる方法は 2 つあります。両方のサンプル コードを以下に示しますので、必要に応じていずれか一方を使用してください。
    • cmdLogin_ServerClick イベント内で RedirectFromLoginPage メソッドを呼び出し、自動的にフォーム認証 Cookie を生成して、ユーザーを適切なページにリダイレクトします。
      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
      if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
      	FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,
      		chkPersistCookie.Checked);
      	else
      		Response.Redirect("logon.aspx", true);
      }
      						
    • 認証チケットを生成して暗号化し、Cookie を作成して応答に追加し、ユーザーをリダイレクトします。この方法では、Cookie の作成方法をより詳細に制御できます。この場合、FormsAuthenticationTicket と一緒にカスタム データを含めることもできます。
      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
      if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
         {
      FormsAuthenticationTicket tkt;
      string cookiestr;
      HttpCookie ck;
      tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, 
      DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");
      cookiestr = FormsAuthentication.Encrypt(tkt);
      ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);
      if (chkPersistCookie.Checked)
      ck.Expires=tkt.Expiration;	
      		    ck.Path = FormsAuthentication.FormsCookiePath; 
      Response.Cookies.Add(ck);
      
      string strRedirect;
      strRedirect = Request["ReturnUrl"];
      if (strRedirect==null)
      strRedirect = "default.aspx";
      Response.Redirect(strRedirect, true);
         }
      else
      Response.Redirect("logon.aspx", true);
      }
      						
  5. Web フォーム デザイナーによって生成されたコード内の InitializeComponent メソッドに、次のコードを追加します。
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
    					

Default.aspx ページの作成

ここでは、認証されたユーザーがリダイレクトされるテスト ページを作成します。アプリケーションにログオンしていないユーザーがこのページを参照すると、ログオン ページにリダイレクトされます。
  1. 既存の WebForm1.aspx ページの名前を Default.aspx に変更し、エディターで開きます。
  2. HTML ビューに切り替え、次のコードを <form> タグの間に貼り付けます。
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    						
    このボタンは、フォーム認証セッションからログオフするときに使用します。
  3. デザイン ビューに切り替えてページを保存します。
  4. コード ビハインド ファイルに必要な名前空間をインポートします。
    using System.Web.Security;
    					
  5. [SignOut] をダブルクリックしてコード ビハインド ページ (Default.aspx.cs) を開き、cmdSignOut_ServerClick イベント ハンドラーに次のコードを貼り付けます。
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
    FormsAuthentication.SignOut();
    Response.Redirect("logon.aspx", true);
    }
    					
  6. Web フォーム デザイナーによって生成されたコード内の InitializeComponent メソッドに、次のコードを追加します。
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    					
  7. プロジェクトを保存してコンパイルします。これでアプリケーションを使用できます。

その他の注意事項

  • パスワードをセキュリティで保護された状態でデータベースに保存する必要がある場合は、FormsAuthentication クラスの HashPasswordForStoringInConfigFile というユーティリティ関数を使用すると、データベースや構成ファイルにパスワードを格納する前にパスワードを暗号化できます。
  • SQL 接続情報は、必要に応じて容易に修正できるように、構成ファイル (Web.config) に保存することもできます。
  • ハッカーがさまざまなパスワードの組み合わせでログオンを試みるのを防止するコードを追加することもできます。たとえば、ログオンの試行を 2 回または 3 回までしか受け付けないロジックを含めることができます。ユーザーが特定の回数試行してもログオンできない場合は、別のページにアクセスするかサポート窓口に連絡して自分のアカウントを再度有効にするまで、そのユーザーのログオンを拒否するフラグをデータベースに設定することもできます。この場合は、必要に応じて適切なエラー処理を追加する必要があります。
  • ユーザーは認証 Cookie に基づいて識別されるため、転送中の認証 Cookie やその他の重要な情報が他のユーザーに盗聴されないように、このアプリケーションに対して SSL (Secure Sockets Layer) を使用することもできます。
  • フォーム ベースの認証を使用するには、クライアントのブラウザーで Cookie を有効にする必要があります。
  • <authentication> 構成セクションの timeout パラメーターは、認証 cookie が再生成される間隔を制御します。より良いパフォーマンスとセキュリティを提供する値を選択できます。
  • インターネット上の中間プロキシやキャッシュの中には、Set-Cookie ヘッダーを含む Web サーバーの応答もキャッシュするものがあります。キャッシュされた応答は、後で別のユーザーに返されます。フォームベースの認証では Cookie を使用してユーザーを認証するため、別のユーザーに対して作成された Cookie を中間プロキシやキャッシュから受け取ったユーザーは、意図しなくても (または故意に) 別のユーザーを偽装することになります。

関連情報

<credentials> セクションを使用してユーザーとパスワードを保存する簡単なフォーム ベースの認証を実装する方法の詳細については、次の GotDotNet の ASP.NET クイック スタート サンプルを参照してください。
フォーム ベースの認証
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx
XML ファイルを使用してユーザーとパスワードを保存するフォーム ベースの認証を実装する方法の詳細については、.NET Framework Software Development Kit (SDK) ドキュメントの次のトピックを参照してください。
XML の Users ファイルを使用したフォーム認証
http://msdn2.microsoft.com/ja-jp/library/1b1y85bh(vs.71).aspx
ASP.NET Web アプリケーションのセキュリティの詳細については、次の Microsoft .NET Framework 開発者ガイドのドキュメントを参照してください。
ASP.NET Web アプリケーションのセキュリティ
http://msdn2.microsoft.com/ja-jp/library/330a99hc(vs.71).aspx
System.Web.Security 名前空間の詳細については、以下の .NET Framework SDK リファレンスのドキュメントを参照してください。
System.Web.Security 名前空間
http://msdn2.microsoft.com/ja-jp/library/system.web.security(vs.71).aspx
ASP.NET 構成の詳細については、次の Microsoft .NET Framework 開発者ガイドのドキュメントを参照してください。
ASP.NET の構成
http://msdn2.microsoft.com/ja-jp/library/aa719558(VS.71).aspx

ASP.NET の構成セクション
http://msdn2.microsoft.com/ja-jp/library/w7w4sb0w(vs.71).aspx
ASP.NET セキュリティ ガイドラインについては、次の MSDN ホワイト ペーパーを参照してください。
ASP.NET における認証: .NET セキュリティ ガイド
http://msdn2.microsoft.com/ja-jp/library/ms978378.aspx
ASP.NET に関するより一般的な情報については、以下の MSDN ニュースグループを参照してください。
http://social.msdn.microsoft.com/Forums/ja-JP/categories/
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。

プロパティ

文書番号: 301240 - 最終更新日: 2012年6月29日 - リビジョン: 1.0
この資料は以下の製品について記述したものです。
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 64-bit Edition
キーワード:?
kbconfig kbhowtomaster kbsecurity kbweb KB301240
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com