方法 : 簡単なフォーム認証を実装する

更新 : 2007 年 11 月

このトピックの例では、ASP.NET フォーム認証の簡単な実装を示します。この例では、フォーム認証を使用してユーザーを ASP.NET アプリケーションにログインさせる方法を示します。

xdt4thhy.alert_note(ja-jp,VS.90).gifメモ :

フォーム認証を簡単に処理するには、ASP.NET メンバシップと ASP.NET ログイン コントロールを使用します。ASP.NET メンバシップにはユーザーを認証するためのメソッドがあり、ユーザー情報を格納して管理する手段を提供します。ASP.NET ログイン コントロールは ASP.NET メンバシップと共に使用し、ユーザーに資格情報の入力を求め、ユーザーを検証し、パスワードを回復または置き換えるなどの処理に必要なロジックをカプセル化します。実際には、ASP.NET メンバシップと ASP.NET ログイン コントロールはフォーム認証に関する抽象化レイヤを提供し、フォーム認証を使用するために一般的に必要なほとんどまたはすべての作業を置き換えます。詳細については、「メンバシップを使用したユーザーの管理」および「ASP.NET ログイン コントロールの概要」を参照してください。

この例のシナリオでは、ユーザーは、保護されたリソースである Default.aspx というページを要求します。この保護されたリソース jchen@contoso.com にアクセスできるのは "37Yj*99P" のパスワードを持つユーザーだけです。ユーザー名とパスワードは、Login.aspx ファイルにハードコーディングされています。この例には、Web.config ファイル、Logon.aspx ページ、および Default.aspx ページの 3 つのファイルが必要です。これらのファイルは、アプリケーション ルート ディレクトリに置かれます。

フォーム認証を使用するようにアプリケーションを構成するには

  1. アプリケーション ルートに Web.config ファイルがある場合は、それを開きます。

  2. アプリケーションのルート フォルダに Web.config ファイルがない場合、Web.config というテキスト ファイルを作成して次の要素を追加します。

    <?xml version="1.0"?>
    <configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0">
        <system.web>
    
        </system.web>
    </configuration>
    
  3. system.web 要素で、authentication 要素を作成し、次の例のように、mode 属性を Forms に設定します。

    <system.web>
      <authentication mode="Forms">  </authentication>
    </system.web>
    
  4. authentication 要素で、forms 要素を作成し、次の属性を設定します。

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

    • name   ".ASPXFORMSAUTH" に設定します。これによって、認証チケットを含む Cookie の名前にサフィックスが設定されます。

    <system.web>
      <authentication mode="Forms">
        <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH">    </forms>
      </authentication>
    </system.web>
    
  5. system.web 要素に authorization 要素を作成します。

    <system.web>
      <authentication mode="Forms">
        <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH">
        </forms>
      </authentication>
      <authorization>  </authorization>
    </system.web>
    
  6. authorization 要素で、deny 要素を作成し、users 属性を "?" に設定します。これによって、"?" で表される認証されないユーザーはアプリケーションのリソースへのアクセスを拒否されます。

    <system.web>
      <authentication mode="Forms">
        <forms loginUrl="logon.aspx" name=".ASPXFORMSAUTH">
        </forms>
      </authentication>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
    
  7. Web.config ファイルを保存して閉じます。

ログイン ページの作成

Web サイトのページを要求したユーザーがこれまでに認証されていない場合は、Logon.aspx というページにリダイレクトされます。このファイル名は Web.config ファイルで既に指定しています。

Logon.aspx ページでは、ユーザーの資格情報 (電子メール アドレスとパスワード) を収集して認証します。正しく認証されたユーザーは、ログオン ページによってユーザーが要求しているページにリダイレクトされます。この例では、有効な証明書はページにハードコーディングされています。

xdt4thhy.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

この例には、ユーザー入力を受け付けるテキスト ボックスがあるため、セキュリティ上の脅威になる可能性があります。既定では、ASP.NET Web ページは、ユーザー入力にスクリプトまたは HTML 要素が含まれていないことを検証します。詳細については、「スクリプトによる攻略の概要」を参照してください。

ログオン ページを作成するには

  1. アプリケーションのルート フォルダに Logon.aspx という ASP.NET ページを作成します。

  2. 次のマークアップとコードをコピーします。

    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Web.Security" %>
    
    <script runat="server">
      Sub Logon_Click(ByVal sender As Object, ByVal e As EventArgs)
        If ((UserEmail.Text = "jchen@contoso.com") And _
                (UserPass.Text = "37Yj*99Ps")) Then
          FormsAuthentication.RedirectFromLoginPage _
               (UserEmail.Text, Persist.Checked)
        Else
          Msg.Text = "Invalid credentials. Please try again."
        End If
      End Sub
    </script>
    
    <html>
    <head id="Head1" runat="server">
      <title>Forms Authentication - Login</title>
    </head>
    <body>
      <form id="form1" runat="server">
        <h3>
          Logon Page</h3>
        <table>
          <tr>
            <td>
              E-mail address:</td>
            <td>
              <asp:TextBox ID="UserEmail" runat="server" /></td>
            <td>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
                ControlToValidate="UserEmail"
                Display="Dynamic" 
                ErrorMessage="Cannot be empty." 
                runat="server" />
            </td>
          </tr>
          <tr>
            <td>
              Password:</td>
            <td>
              <asp:TextBox ID="UserPass" TextMode="Password" 
                runat="server" />
            </td>
            <td>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator2" 
                ControlToValidate="UserPass"
                ErrorMessage="Cannot be empty." 
                runat="server" />
            </td>
          </tr>
          <tr>
            <td>
              Remember me?</td>
            <td>
              <asp:CheckBox ID="Persist" runat="server" /></td>
          </tr>
        </table>
        <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On"  
           runat="server" />
        <p>
          <asp:Label ID="Msg" ForeColor="red" runat="server" />
        </p>
      </form>
    </body>
    </html>
    
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Web.Security" %>
    
    <script runat="server">
      void Logon_Click(object sender, EventArgs e)
      {
        if ((UserEmail.Text == "jchen@contoso.com") && 
                (UserPass.Text == "37Yj*99Ps"))
          {
              FormsAuthentication.RedirectFromLoginPage 
                 (UserEmail.Text, Persist.Checked);
          }
          else
          {
              Msg.Text = "Invalid credentials. Please try again.";
          }
      }
    </script>
    <html>
    <head id="Head1" runat="server">
      <title>Forms Authentication - Login</title>
    </head>
    <body>
      <form id="form1" runat="server">
        <h3>
          Logon Page</h3>
        <table>
          <tr>
            <td>
              E-mail address:</td>
            <td>
              <asp:TextBox ID="UserEmail" runat="server" /></td>
            <td>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
                ControlToValidate="UserEmail"
                Display="Dynamic" 
                ErrorMessage="Cannot be empty." 
                runat="server" />
            </td>
          </tr>
          <tr>
            <td>
              Password:</td>
            <td>
              <asp:TextBox ID="UserPass" TextMode="Password" 
                 runat="server" />
            </td>
            <td>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator2" 
                ControlToValidate="UserPass"
                ErrorMessage="Cannot be empty." 
                runat="server" />
            </td>
          </tr>
          <tr>
            <td>
              Remember me?</td>
            <td>
              <asp:CheckBox ID="Persist" runat="server" /></td>
          </tr>
        </table>
        <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" 
           runat="server" />
        <p>
          <asp:Label ID="Msg" ForeColor="red" runat="server" />
        </p>
      </form>
    </body>
    </html>
    

    このページには、ユーザー情報を収集するための ASP.NET サーバー コントロールおよびユーザーがログイン資格情報を永続的に保存できるチェック ボックスが含まれます。[ログオン] ボタンの Click ハンドラには、ハードコーディングされた値に対してユーザーの電子メール アドレスとパスワードをチェックするコードが含まれます。パスワードは、アルファベット以外のさまざまな文字を含む、8 文字以上の強力なパスワードです。ユーザーの資格情報が正しい場合、コードは FormsAuthentication クラスの RedirectFromLoginPage メソッドを呼び出し、ユーザー名および認証チケットを Cookie として永続化するかどうかを示すブール値 (チェック ボックスから派生) を渡します。このメソッドは、ユーザーが要求しているページにユーザーをリダイレクトします。ユーザーの資格情報が適合しない場合は、エラー メッセージが表示されます。このページは、FormsAuthentication クラスを含む System.Web.Security 名前空間をインポートします。

既定のページの作成

この例では、アプリケーションのルート フォルダに ASP.NET ページを作成します。構成ファイルで認証されなかったすべてのユーザーに対して、アプリケーションの ASP.NET リソース (HTML ファイルやイメージ、音楽などのマルチメディア ファイルなどの静的なファイルは含まず、.aspx ファイルを含む) へのアクセスを拒否するように指定しているため、ユーザーがページを要求すると、フォーム認証はユーザーの資格情報をチェックし、必要に応じてユーザーをログオン ページにリダイレクトします。作成するページによって、ユーザーはログアウトできます。ログアウトすると、永続化されている認証チケット (Cookie) がクリアされます。

既定のページを作成するには

  1. アプリケーションのルート フォルダに Default.aspx という ASP.NET ページを作成します。

  2. 次のマークアップとコードをコピーします。

    <%@ Page Language="VB" %>
    <html>
    <head>
      <title>Forms Authentication - Default Page</title>
    </head>
    
    <script runat="server">
      Sub Page_Load(ByVal Src As Object, ByVal e As EventArgs)
        Welcome.Text = "Hello, " & Context.User.Identity.Name
      End Sub
    
      Sub Signout_Click(ByVal sender As Object, ByVal e As EventArgs)
        FormsAuthentication.SignOut()
        Response.Redirect("Logon.aspx")
      End Sub
    </script>
    
    <body>
      <h3>
        Using Forms Authentication</h3>
      <asp:Label ID="Welcome" runat="server" />
      <form id="Form1" runat="server">
        <asp:Button ID="Submit1" OnClick="Signout_Click" 
           Text="Sign Out" runat="server" /><p>
      </form>
    </body>
    </html>
    
    <%@ Page Language="C#" %>
    <html>
    <head>
      <title>Forms Authentication - Default Page</title>
    </head>
    
    <script runat="server">
      void Page_Load(object sender, EventArgs e)
      {
        Welcome.Text = "Hello, " + Context.User.Identity.Name;
      }
    
      void Signout_Click(object sender, EventArgs e)
      {
        FormsAuthentication.SignOut();
        Response.Redirect("Logon.aspx");
      }
    </script>
    
    <body>
      <h3>
        Using Forms Authentication</h3>
      <asp:Label ID="Welcome" runat="server" />
      <form id="Form1" runat="server">
        <asp:Button ID="Submit1" OnClick="Signout_Click" 
           Text="Sign Out" runat="server" /><p>
      </form>
    </body>
    </html>
    

    このページにはユーザーの認証 ID が表示されます。この ID は、FormsAuthentication クラスによって設定され、ASP.NET ページで Context.User.Identity.Name プロパティとして使用できます。[サインアウト] ボタンの Click ハンドラには、SignOut メソッドを呼び出して、ユーザーの ID をクリアし、認証チケット (Cookie) を削除するコードが含まれます。このコードは、その後にユーザーをログオン ページにリダイレクトします。

参照

概念

Web アプリケーションのセキュリティに関する基本的な対策

参照

ASP.NET ログイン コントロールの概要

その他の技術情報

ASP.NET Web アプリケーションのセキュリティ

メンバシップを使用したユーザーの管理