次の方法で共有


Login.aspx ファイル

Logon.aspx は、ASP.NET が要求に関連付けられた Cookie を検出できなかった場合に、その要求のリダイレクト先となるファイルです。この URL は、構成ファイルで設定してあります。次の例では、クライアント ユーザーに対して、2 つのテキスト ボックス ([E-mail Name] および [Password]) と [Submit] ボタンのあるフォームが表示されます。ユーザーは電子メール名とパスワードを入力し、[Submit] をクリックします。次に、コードは、このディレクトリにある XML ファイルでこの名前とパスワードの組み合わせを検索します。ファイル内に存在する場合、ユーザーは Default.aspx に接続されます。存在しない場合は、AddUser.aspx ファイルが呼び出されます。

ユーザーをログオンするファイルを作成するには

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

    <%@ Page LANGUAGE="C#" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SqlClient" %>
    <%@ Import Namespace="System.Web.Security " %>
    <%@ Import Namespace="System.IO" %>
    
    <html>
    <head>
    <title>Forms Authentication</title>
    
  2. コードにスクリプト セクションを作成します。

    <script runat=server>
    
  3. Logon_Click 関数を実装します。

    private void Logon_Click(Object sender, EventArgs e) 
    {
    
    1. ページが有効でない場合は、ユーザーに対してメッセージを表示します。

          if( !Page.IsValid ) 
          {
              Msg.Text = "Some required fields are invalid.";
              return;
          }
      

      cmd という文字列を UserEmail="MyName" として初期化するように設定します。ここで、MyName はユーザーの電子メール名です。入力コントロールに添付された正規表現検証コントロールによって、電子メール名は適切に書式指定され、無効な文字列が含まれてないことが判明しています。

          String cmd = "UserEmail='" + UserEmail.Value + "'";
      
    2. DataSet クラスの新しいインスタンスを作成します。

          DataSet ds = new DataSet();
      
    3. 認証済みのユーザー名とパスワードの組み合わせを格納している XML ファイルを読み取ります。取得されたデータは ds、つまり前の手順で作成した DataSet に格納されます。

      注意   簡単でわかりやすい例にするために、次に示すコードは、セキュリティ面では最良のデザインではありません。このコードでは、ファイル ロック フラグやファイル共有フラグは呼び出されません。また、商用の Web サイトでは、リレーショナル データベースや安全でスケーラブルな機構を使用して、認証ユーザーのリストを保管します。

          FileStream fs = new FileStream(Server.MapPath("Users.xml"), 
                                        FileMode.Open,FileAccess.Read);
          StreamReader reader = new StreamReader(fs);
          ds.ReadXml(reader);
          fs.Close();
      
    4. DataTable の新規のインスタンスを users という名前で作成し、ds として初期化します。

          DataTable users = ds.Tables[0];
      
    5. ログオン名と Users.aspx の名前のリストとの間で一致する値があるかどうかをチェックします。一致する値が見つかるたびに、その名前を matches という DataRow に記録します。

      メモ   説明を簡単にするために、この例ではすべての名前が一意であることを前提としています。そのため、1 つの名前については最初に一致したものだけが使用されます。

          DataRow[] matches = users.Select(cmd);
      
    6. 前の手順で見つかった一致する名前をそれぞれチェックし、それらに一致するパスワードがあるかどうかを調べます。

          if( matches != null && matches.Length > 0 ) 
          {
      
    7. ユーザー名の一致が検出された場合は、ユーザーのパスワードをハッシュし、それを Users.xml ファイルに格納されているハッシュ値と比較します。

              DataRow row = matches[0];
              string hashedpwd = 
                  FormsAuthentication.HashPasswordForStoringInConfigFile
                      (UserPass.Value, "SHA1");
              String pass = (String)row["UserPassword"];
              if( 0 != String.Compare(pass, hashedpwd, false) ) 
                  // Tell the user if no password match is found. It is good  
                  // security practice give no hints about what parts of the
                  // logon credentials are invalid.
                  Msg.Text = "Invalid Credentials: Please try again.";
              else 
                  // If a password match is found, redirect the request
                  // to the originally requested resource (Default.aspx).
                  FormsAuthentication.RedirectFromLoginPage
                      (UserEmail.Value, Persist.Checked);
          }
          else 
          {
      // If no name matches were found, redirect the request to the
      // AddUser page using a Response.Redirect command.
              Response.Redirect("AddUser/AddUser.aspx");
          }
      }
      </script>
      <body>
      
  4. ログオン情報を収集するためのフォームを表示します。

    <form runat=server>
        <span style="background:#80FF80">
        <h3><font face="Verdana">Logon Page</font></h3></span>
        <table>
            <tr>
    
    1. [User E-mail Name] ボックスを作成します。有効な電子メール名のエントリをチェックするために、RequiredFieldValidator コントロールと RegularExpressionValidator コントロールを追加します。RegularExpressionValidator は、電子メール アドレスが有効な電子メール形式 (たとえば、name@contoso.com) であり、セキュリティを低下させる無効な文字が含まれていないかどうかを検証します。

                  <td>e-mail:</td>
                  <td><input id="UserEmail" type="text" runat=server/></td>
                  <td><ASP:RequiredFieldValidator 
                       ControlToValidate="UserEmail" 
                       Display="Static"
                       ErrorMessage="*"
                       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="*"
                       runat="server"/>
                  </td>
              </tr>
              <tr>
      
    3. [Persistent Cookie] チェック ボックスを作成します。[Persistent Cookie] チェック ボックスをオンにすると、このフォームは複数のブラウザ セッションにわたって有効になります。オフにした場合は、ブラウザを閉じた時点で Cookie が破棄されます。永続的な Cookie は、利便性の面からサイトによっては望ましいこともありますが、有効期間が短い Cookie よりも保護機能は低下します。

                  <td>Persistent Cookies:</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"/>
      </form>
      </body>
      </html>
      

参照

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