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

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

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

先頭に戻る

必要条件

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

Visual Basic .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 ドキュメントを参照してください。次のコードは、手順 2. と 3. の例です。コードをコピーし、[編集] メニューの [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]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 データベース内に配置されます。
先頭に戻る

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.vb) を提供します。
  1. Logon.aspx.vb ファイルを開きます。
  2. コード ビハインド ファイルに必要な名前空間をインポートします。
    Imports System.Data.SqlClientImports System.Web.Security					
  3. データベースを調べてユーザー資格情報を検証する ValidateUser 関数を作成します (接続文字列の部分は、使用しているデータベースを指定するように変更してください)。
    Private Function ValidateUser(ByVal userName As String, ByVal passWord As String) As Boolean        Dim conn As SqlConnection        Dim cmd As SqlCommand        Dim lookupPassword As String        lookupPassword = Nothing        ' Check for an invalid userName.        ' userName  must not be set to nothing and must be between one and 15 characters.        If ((userName Is Nothing)) Then            System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")            Return False        End If        If ((userName.Length = 0) Or (userName.Length > 15)) Then            System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")            Return False        End If        ' Check for invalid passWord.        ' passWord must not be set to nothing and must be between one and 25 characters.        If (passWord Is Nothing) Then            System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")            Return False        End If        If ((passWord.Length = 0) Or (passWord.Length > 25)) Then            System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")            Return False        End If        Try            ' Consult with your SQL Server administrator for an appropriate connection            ' string to use to connect to your local SQL Server.            conn = New SqlConnection("server=localhost;Integrated Security=SSPI;database=pubs")            conn.Open()            ' Create SqlCommand to select pwd field from the users table given a supplied userName.            cmd = New SqlCommand("Select pwd from users where uname=@userName", conn)            cmd.Parameters.Add("@userName", SqlDbType.VarChar, 25)            cmd.Parameters("@userName").Value = userName            ' Execute command and fetch pwd field into lookupPassword string.            lookupPassword = cmd.ExecuteScalar()            ' Cleanup command and connection objects.            cmd.Dispose()            conn.Dispose()        Catch ex As Exception            ' Add error handling here for debugging.            ' This error message should not be sent back to the caller.            System.Diagnostics.Trace.WriteLine("[ValidateUser] Exception " & ex.Message)        End Try        ' If no password found, return false.        If (lookupPassword Is Nothing) Then            ' You could write failed login attempts here to the event log for additional security.            Return False        End If        ' Compare lookupPassword and input passWord by using a case-sensitive comparison.        Return (String.Compare(lookupPassword, passWord, False) = 0)End Function					
  4. cmdLogin_ServerClick イベントでは、フォーム認証 Cookie を生成し、ユーザーを適切なページにリダイレクトします。そのために使用できる方法は 2 つあります。両方のサンプル コードを以下に示しますので、必要に応じていずれか一方を使用してください。
    • cmdLogin_ServerClick イベント内で RedirectFromLoginPage メソッドを呼び出し、自動的にフォーム認証 Cookie を生成して、ユーザーを適切なページにリダイレクトします。
      Private Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _   Handles cmdLogin.ServerClick   If ValidateUser(txtUserName.Value,txtUserPass.value) Then      FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _      chkPersistCookie.Checked)   Else      Response.Redirect("logon.aspx", True)   End IfEnd Sub						
    • 認証チケットを生成して暗号化し、Cookie を作成して応答に追加し、ユーザーをリダイレクトします。この方法では、Cookie の作成方法をより詳細に制御できます。この場合、FormsAuthenticationTicket と一緒にカスタム データを含めることもできます。
      Private Sub cmdLogin_ServerClick(ByVal sender As Object, _   ByVal e As System.EventArgs) Handles cmdLogin.ServerClick   If Validateuser(txtUserName.Value,txtUserPass.Value) Then      Dim tkt As FormsAuthenticationTicket      Dim cookiestr As String      Dim ck As HttpCookie      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) then ck.Expires=tkt.Expiration       ck.Path = FormsAuthentication.FormsCookiePath()       Response.Cookies.Add(ck)      Dim strRedirect As String      strRedirect = Request("ReturnURL")      If strRedirect <> "" Then         Response.Redirect(strRedirect, True)      Else         strRedirect = "default.aspx"         Response.Redirect(strRedirect, True)      End If   Else      Response.Redirect("logon.aspx", True)   End IfEnd Sub						
先頭に戻る

Default.aspx ページの作成

ここでは、認証されたユーザーがリダイレクトされるテスト ページを作成します。アプリケーションにログオンしていないユーザーがこのページを参照すると、ログオン ページにリダイレクトされます。
  1. 既存の WebForm1.aspx ページの名前を Default.aspx に変更し、エディタで開きます。
  2. HTML ビューに切り替え、次のコードを <form> タグの間に貼り付けます。
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">						
    このボタンは、フォーム認証セッションからログオフするときに使用します。
  3. デザイン ビューに切り替えてページを保存します。
  4. コード ビハインド ファイルに必要な名前空間をインポートします。
    Imports System.Web.Security					
  5. コード ビハインド ページ (Default.aspx.vb) を開いて、次のコードを cmdSignOut_ServerClick イベント ハンドラにコピーします。
    Private Sub cmdSignOut_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _Handles cmdSignOut.ServerClick   FormsAuthentication.SignOut()   Response.Redirect("logon.aspx", True)End Sub					
  6. プロジェクトを保存してコンパイルします。これでアプリケーションを使用できます。
先頭に戻る

トラブルシューティング

  • パスワードをセキュリティで保護された状態でデータベースに保存する必要がある場合は、FormsAuthentication クラスの HashPasswordForStoringInConfigFile というユーティリティ関数を使用すると、データベースや構成ファイルにパスワードを格納する前にパスワードを暗号化できます。
  • SQL 接続情報は、必要に応じて容易に修正できるように、構成ファイル (Web.config) に保存することもできます。
  • ハッカーがさまざまなパスワードの組み合わせでログオンを試みるのを防止するコードを追加することもできます。たとえば、ログオンの試行を 2 回または 3 回までしか受け付けないロジックを含めることができます。ユーザーが特定の回数試行してもログオンできない場合は、別のページにアクセスするかサポート窓口に連絡して自分のアカウントを再度有効にするまで、そのユーザーのログオンを拒否するフラグをデータベースに設定することもできます。この場合は、必要に応じて適切なエラー処理を追加する必要があります。
  • ユーザーは認証 Cookie に基づいて識別されるため、転送中の認証 Cookie やその他の重要な情報が他のユーザーに取り出されないように、このアプリケーションに対して SSL (Secure Sockets Layer) を使用することもできます。
  • フォーム ベースの認証を使用するには、クライアントのブラウザで Cookie を有効にする必要があります。
  • <authentication> 構成セクションの timeout パラメータは、認証 cookie が再生成される間隔を制御します。より良いパフォーマンスとセキュリティを提供する値を選択することができます。
  • インターネット上の中間プロキシやキャッシュの中には、Set-Cookie ヘッダーを含む Web サーバーの応答もキャッシュするものがあります。キャッシュされた応答は、後で別のユーザーに返されます。フォーム ベースの認証では Cookie を使用してユーザーを認証するため、別のユーザーに対して作成された Cookie を中間プロキシやキャッシュから受け取ったユーザーは、意図しなくても (または故意に) 別のユーザーを偽装することになります。
先頭に戻る
関連情報
<credentials> セクションを使用してユーザーとパスワードを保存する簡単なフォーム ベースの認証の実装方法については、次の ASP.NET QuickStart サンプルを参照してください。XML (Extensible Markup Language) ファイルを使用してユーザーとパスワードを保存して、フォーム ベースの認証を実装する方法については、.NET Framework Software Development Kit (SDK) のドキュメントで次のトピックを参照してください。ASP.NET Web アプリケーションのセキュリティについては、.NET Framework SDK ドキュメントの次の資料を参照してください。System.Web.Security 名前空間の詳細については、.NET Framework SDK ドキュメントの次の資料を参照してください。ASP.NET の構成の詳細については、次の .NET Framework SDK の資料を参照してください。ASP.NET のセキュリティ ガイドラインについては、以下の MSDN ホワイト ペーパーを参照してください。
ASP.NET における認証 : .NET セキュリティ ガイド
http://www.microsoft.com/japan/developer/net/dnBDA/authaspdotnet.asp
ASP.NET に関するより一般的な情報については、以下の MSDN ニュースグループを参照してください。詳細については、以下の書籍を参照してください。先頭に戻る
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 308157 (最終更新日 2005-08-12) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。
forms authentication
プロパティ

文書番号:308157 - 最終更新日: 10/29/2007 14:53:07 - リビジョン: 8.6

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 7.0 Standard Edition

  • kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157
フィードバック