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

文書翻訳 文書翻訳
文書番号: 308157 - 対象製品
この記事は、以前は次の 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]
    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.vb) を提供します。
  1. Logon.aspx.vb ファイルを開きます。
  2. コード ビハインド ファイルに必要な名前空間をインポートします。
    Imports System.Data.SqlClient
    Imports 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 If
      End 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 If
      End 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 サンプルを参照してください。
フォーム ベースの認証
http://ja.gotdotnet.com/QuickStart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx
XML (Extensible Markup Language) ファイルを使用してユーザーとパスワードを保存して、フォーム ベースの認証を実装する方法については、.NET Framework Software Development Kit (SDK) のドキュメントで次のトピックを参照してください。
XML の Users ファイルを使用したフォーム認証
http://msdn.microsoft.com/library/ja/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp
ASP.NET Web アプリケーションのセキュリティについては、.NET Framework SDK ドキュメントの次の資料を参照してください。
ASP.NET Web アプリケーションのセキュリティ
http://msdn.microsoft.com/library/ja/cpguide/html/cpconaspnetwebapplicationsecurity.asp
System.Web.Security 名前空間の詳細については、.NET Framework SDK ドキュメントの次の資料を参照してください。
http://msdn.microsoft.com/library/ja/cpref/html/frlrfSystemWebSecurity.asp
ASP.NET の構成の詳細については、次の .NET Framework SDK の資料を参照してください。
ASP.NET の構成
http://msdn.microsoft.com/library/ja/cpguide/html/cpconaspnetconfiguration.asp

ASP.NET の構成セクション
http://msdn.microsoft.com/library/ja/cpguide/html/cpgrfaspnetconfigurationsections.asp
ASP.NET のセキュリティ ガイドラインについては、以下の MSDN ホワイト ペーパーを参照してください。
ASP.NET における認証 : .NET セキュリティ ガイド
http://www.microsoft.com/japan/developer/net/dnBDA/authaspdotnet.asp
ASP.NET に関するより一般的な情報については、以下の MSDN ニュースグループを参照してください。
http://www.microsoft.com/japan/msdn/newsgroups/default.mspx
詳細については、以下の書籍を参照してください。
Building Web Solutions with ASP.NET and ADO.NET』 (Dino Esposito 著、Microsoft Press、2001 年)

Writing Secure Code 第 2 版 (上) - プログラマのためのセキュリティ対策テクニック』『Writing Secure Code 第 2 版 (下) - プログラマのためのセキュリティ対策テクニック』 (Michael Howard、David LeBlanc 著、日経 BP ソフトプレス、2004 年)

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 308157 (最終更新日 2005-08-12) を基に作成したものです。

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

プロパティ

文書番号: 308157 - 最終更新日: 2007年10月29日 - リビジョン: 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
"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