現在オフラインです。再接続するためにインターネットの接続を待っています

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

この記事は、以前は次の ID で公開されていました: JP301240
概要
この資料では、データベースを使用してユーザーを格納することにより、フォーム ベースの認証を実装する方法について説明します。

back to the top

必要条件

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

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

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

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>					
back to the top

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

ここでは、ユーザー名、パスワード、およびユーザーのロールを格納するサンプル データベースの作成方法について説明します。ユーザーのロールをデータベースに保存してロールベースのセキュリティを実装する場合は、ロール列を作成する必要があります。
  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]GOCREATE TABLE [dbo].[Users] ([uname] [varchar] (15) NOT NULL ,[Pwd] [varchar] (25) NOT NULL ,[userRole] [varchar] (25) NOT NULL ,) ON [PRIMARY]GOALTER TABLE [dbo].[Users] WITH NOCHECK ADD CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED    ([uname])  ON [PRIMARY] GOINSERT 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 データベースに追加されます。
back to the top

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. デザイン ビューに切り替えてページを保存します。
back to the top

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

ここでは、コード ビハインド ページ (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);   }elseResponse.Redirect("logon.aspx", true);}						
  5. Web フォーム デザイナーによって生成されたコード内の InitializeComponent メソッドに、次のコードを追加します。
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);					
back to the top

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. プロジェクトを保存してコンパイルします。これでアプリケーションを使用できます。
back to the top

その他の注意事項

  • パスワードをセキュリティで保護された状態でデータベースに保存する必要がある場合は、FormsAuthentication クラスの HashPasswordForStoringInConfigFile というユーティリティ関数を使用すると、データベースや構成ファイルにパスワードを格納する前にパスワードを暗号化できます。
  • SQL 接続情報は、必要に応じて容易に修正できるように、構成ファイル (Web.config) に保存することもできます。
  • ハッカーがさまざまなパスワードの組み合わせでログオンを試みるのを防止するコードを追加することもできます。たとえば、ログオンの試行を 2 回または 3 回までしか受け付けないロジックを含めることができます。ユーザーが特定の回数試行してもログオンできない場合は、別のページにアクセスするかサポート窓口に連絡して自分のアカウントを再度有効にするまで、そのユーザーのログオンを拒否するフラグをデータベースに設定することもできます。この場合は、必要に応じて適切なエラー処理を追加する必要があります。
  • ユーザーは認証 Cookie に基づいて識別されるため、転送中の認証 Cookie やその他の重要な情報が他のユーザーに盗聴されないように、このアプリケーションに対して SSL (Secure Sockets Layer) を使用することもできます。
  • フォーム ベースの認証を使用するには、クライアントのブラウザーで Cookie を有効にする必要があります。
  • <authentication> 構成セクションの timeout パラメーターは、認証 cookie が再生成される間隔を制御します。より良いパフォーマンスとセキュリティを提供する値を選択できます。
  • インターネット上の中間プロキシやキャッシュの中には、Set-Cookie ヘッダーを含む Web サーバーの応答もキャッシュするものがあります。キャッシュされた応答は、後で別のユーザーに返されます。フォームベースの認証では Cookie を使用してユーザーを認証するため、別のユーザーに対して作成された Cookie を中間プロキシやキャッシュから受け取ったユーザーは、意図しなくても (または故意に) 別のユーザーを偽装することになります。
back to the top
関連情報
<credentials> セクションを使用してユーザーとパスワードを保存する簡単なフォーム ベースの認証を実装する方法の詳細については、次の GotDotNet の ASP.NET クイック スタート サンプルを参照してください。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 リファレンスのドキュメントを参照してください。ASP.NET 構成の詳細については、次の Microsoft .NET Framework 開発者ガイドのドキュメントを参照してください。ASP.NET セキュリティ ガイドラインについては、次の MSDN ホワイト ペーパーを参照してください。
ASP.NET における認証: .NET セキュリティ ガイド
http://msdn2.microsoft.com/ja-jp/library/ms978378.aspx
ASP.NET に関するより一般的な情報については、以下の MSDN ニュースグループを参照してください。back to the top
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:301240 - 最終更新日: 06/29/2012 11:35:00 - リビジョン: 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
フィードバック
;did=1&t=">