Share via


簡単なフォーム認証

ここでは、ASP.NET フォーム認証の最も簡単な実装の例を示します。この例は、フォーム認証を使用する ASP.NET アプリケーションを作成する場合の基本事項を説明することを目的としています。XML ファイルを使用してユーザー名とパスワードを保持する、より複雑なフォーム認証の例については、「XML の Users ファイルを使用したフォーム認証」を参照してください。

このシナリオでは、保護されているリソースである Default.aspx をクライアントが要求します。この保護されたリソースにアクセスできるユーザーは jchen@contoso.com だけで、そのパスワードは password です。ユーザー名とパスワードは、Login.aspx ファイルにハードコーディングされています。この例では、Web.config、Login.aspx、および Default.aspx という 3 つのファイルが使用されます。これらのファイルは、アプリケーションのルート ディレクトリに配置されています。これらのファイル内のコードについては、以降で個別に説明します。

Web.config

Web.config 構成ファイルは、次に示すエントリを設定したうえで、アプリケーションのルート ディレクトリ (Default.aspx のあるディレクトリ) に配置する必要があります。

<configuration>
    <system.web>

Web.config 構成ファイルを設定するには

  1. 認証モードを Forms に設定します。設定できる値には、その他に Windows、Passport、および None (空文字列) があります。この例では、Forms に設定する必要があります。

            <authentication mode="Forms"> 
    
  2. フォームの認証属性を設定します。

                <forms
    
    1. loginUrl 属性を "logon.aspx" に設定します。logon.aspx は、要求に関連付けられている認証 Cookie を ASP.NET が検出できなかった場合のリダイレクト先とする URL です。

                  loginUrl = "logon.aspx"
      
    2. Cookie の名前サフィックスを設定します。

                  name = ".ASPXFORMSAUTH"/>
      
  3. 認証されないユーザーによる、このディレクトリへのアクセスを拒否します。

            </authentication>
            <authorization>
                <deny users="?"/> 
            </authorization>
        </system.web>
    </configuration>
    

Logon.aspx

logon.aspx は、ASP.NET が要求に関連付けられた認証チケットを検出できなかった場合に、その要求のリダイレクト先となるファイルです。このファイル名は構成ファイルの Web.config で指定されています。クライアント ユーザーに対して、2 つのテキスト ボックス ([User E-mail Name] および [Password]) と [Submit] ボタンのあるフォームが表示されます。ユーザーは電子メール名とパスワードを入力し、[Submit] をクリックします。入力された名前とパスワードが、コード内の if ステートメントにハードコーディングされているペアと比較されます。比較が成功すると、ユーザーは Default.aspx に接続されます。失敗すると、ユーザーに対してエラー メッセージが表示されます。

ログオン機能を実装するには

  1. 必要な名前空間をインポートします。

    <%@ Import Namespace="System.Web.Security" %>
    
  2. スクリプト言語を設定します。

        <script language="VB" runat=server>
    [C#]
        <script language="C#" runat=server>
    
  3. 送信イベントを処理する Logon_Click イベント ハンドラを作成します。

            Sub Logon_Click(sender As Object, e As EventArgs)
    [C#]
            void Logon_Click(Object sender, EventArgs e) 
            {
    
  4. 入力された名前とパスワードを、コード内にハードコーディングされている名前 jchen@contoso.com およひパスワード password と比較して、ユーザーを認証します。比較が成功した場合は、保護されているリソース (Default.aspx) に要求をリダイレクトします。比較が失敗した場合は、エラー メッセージを表示します。

                If ((UserEmail.Value = "jchen@contoso.com") And _
                        (UserPass.Value = "password")) Then
                    FormsAuthentication.RedirectFromLoginPage _
                        (UserEmail.Value, Persist.Checked)
                Else
                    Msg.Text = "Invalid Credentials: Please try again."
                End If
            End Sub
        </script>
    [C#]
                if ((UserEmail.Value == "jchen@contoso.com") && 
                    (UserPass.Value == "password")) 
                {
                   FormsAuthentication.RedirectFromLoginPage
                       (UserEmail.Value, Persist.Checked);
                }
                else 
                {
                    Msg.Text = "Invalid Credentials: Please try again.";
                }
            }
        </script>
    
  5. ログオン情報を収集するためのフォームを表示します。

    <body>
    <form runat=server>
        <h3><font face="Verdana">Logon Page</font></h3>
        <table>
            <tr>
    
    1. [User E-mail Name] ボックスを作成します。有効な電子メール エントリをチェックするために必要なフィールド検証コントロールと正規表現検証コントロールを追加します。

              <td>Email:</td>
              <td><input id="UserEmail" type="text" runat=server/></td>
              <td><ASP:RequiredFieldValidator 
                       ControlToValidate="UserEmail" 
                       Display="Static"
                       ErrorMessage="Cannot be empty."
                       runat=server/>
              </td>
              <td><asp:RegularExpressionValidator id="RegexValidator" 
                       ControlToValidate="UserEmail"
                       ValidationExpression="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
                       EnableClientScript="false"
                       Display="Static"
                       ErrorMessage="Invalid format for e-mail address."
                       runat="server"/>
              </td>
          </tr>
          <tr>    
      
    2. [Password] ボックスを作成します。

              <td>Password:</td>
              <td><input id="UserPass" type=password runat=server/></td>
              <td><ASP:RequiredFieldValidator 
                       ControlToValidate="UserPass" 
                       Display="Static"
                       ErrorMessage="Cannot be empty."
                       runat=server/>
              </td>
          </tr>
          <tr>
      
    3. [Persistent Cookie] チェック ボックスを作成します。[Persistent Cookie] チェック ボックスをオンにすると、この Cookie は複数のブラウザ セッションにわたって有効になります。オフにした場合は、ブラウザを閉じた時点で Cookie が破棄されます。

              <td>Persistent Cookie:</td>
              <td><ASP:CheckBox id=Persist runat="server"
                       autopostback="true"/>
              </td>
              <td></td>
          </tr>
      </table>
      
      
    4. ポストバックされたときに Logon_Click イベントを発生させる [Submit] ボタンを作成します。

      <input type="submit" OnServerClick="Logon_Click" Value="Logon" 
              runat="server"/>
      <p><asp:Label id="Msg" ForeColor="red" Font-Name="Verdana" 
                  Font-Size="10" runat=server/></p>
      
    </form>
    </body>
    </html>
    

Default.aspx

Default.aspx ファイルは、このシナリオで要求される、保護されているリソースです。これは、Hello という文字列と、記録されている電子メール名、および [Signout] ボタンを表示するだけの簡単なファイルです。

<%@ Page LANGUAGE="VB" %>
<html>
<head>
<title>Forms Authentication</title>

<script runat=server>
    Sub Page_Load(Src As Object, e As EventArgs) 
        Welcome.InnerHtml = "Hello, " + Context.User.Identity.Name
    End Sub
    Sub Signout_Click(sender As Object, e As EventArgs) 
        FormsAuthentication.SignOut()
        Response.Redirect("logon.aspx")
    End Sub
</script>

<body>
<h3><font face="Verdana">Using Forms Authentication</font></h3>
<span id="Welcome" runat=server/>
<form runat=server>
    <input type="submit" OnServerClick="Signout_Click" Value="Signout"                                                     
           runat="server"/><p>
</form>
</body>
</html>
[C#]
<%@ Page LANGUAGE="C#" %>
<html>
<head>
<title>Forms Authentication</title>
<script runat=server>
    private void Page_Load(Object Src, EventArgs e ) 
    {
        Welcome.InnerHtml = "Hello, " + Context.User.Identity.Name;
    }
    private void Signout_Click(Object sender, EventArgs e) 
    {
        FormsAuthentication.SignOut();
        Response.Redirect("logon.aspx");
    }
</script>

<body>
<h3><font face="Verdana">Using Forms Authentication</font></h3>
<span id="Welcome" runat=server/>
<form runat=server>
    <input type="submit" OnServerClick="Signout_Click" Value="Signout"                                                    
           runat="server"/><p>
</form>
</body>
</html>

参照

ASP.NET Web アプリケーションのセキュリティ | 安全な ASP.NET アプリケーションのデザイン | XML の Users ファイルを使用したフォーム認証