Freigeben über


Datei "AddUser.aspx"

Wenn die Anmeldeseite den E-Mail-Namen nicht in der Datei Users.xml finden kann, leitet sie die Anforderung an die Add User-Seite um. Wenn der Benutzer auf die Schaltfläche Add User klickt, werden der Benutzername und das Kennwort der Datei hinzugefügt.

So implementieren Sie die Add User-Seite

  1. Importieren Sie die erforderlichen Namespaces.

    <%@ 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. Erstellen Sie ein Tag für den Skriptabschnitt.

    <script runat=server>
    
  3. Implementieren Sie eine Page_Load-Funktion.

    private void Page_Load(Object Src, EventArgs e) 
    {
    
    1. Rufen Sie die Zeichenfolgen UserEmail und UserPassword aus der Anforderung ab.

          String email = Request.QueryString["UserEmail"];
      
    2. Wenn der Wert nicht NULL ist, geben Sie im Textfeld UserEmail den E-Mail-Namen des Benutzers ein. UserEmail wurde bereits vom RegularExpressionValidator-Steuerelement auf der Seite Logon.aspx überprüft.

          if( null != email )
          UserEmail.Value = email;
          }
      
  4. Implementieren Sie die AddUser_Click-Funktion. Beachten Sie, dass eine inhärente Racebedingung auftritt, wenn zwei Clients ungefähr gleichzeitig AddUser.aspx aufrufen. Je nachdem, wie diese Aufrufe zeitlich aufeinander folgen, kann ein Client neue Daten in eine Kopie von Users.xml schreiben und damit die gerade erst vom ersten Client geschriebene Datei überschreiben. Wenn Racebedingungen unerwünscht sind, sollte ein Synchronisierungsmechanismus in die Anwendung integriert werden, der sicherstellt, dass Clients AddUser.aspx nicht gleichzeitig ausführen können. Dieser Mechanismus kann sehr einfach sein, z. B. eine Anwendungsvariable, die als Mutex agiert und die jeder Client exklusiv aufruft, bevor der Code im AddUser_Click-Ereignis ausgeführt wird.

    private void AddUser_Click(Object sender, EventArgs e) 
    {
    
    1. Benachrichtigen Sie den Benutzer, wenn die Seite nicht gültig ist.

          if( !Page.IsValid ) 
          {
              Msg.Text = "Some required fields are invalid.";
              return;    
          }
      
    2. Erstellen Sie eine Instanz des DataSet namens ds.

          DataSet ds = new DataSet();
      
    3. Initialisieren Sie eine Zeichenfolge userFile mit dem Pfad der Datei Users.xml.

          String userFile = "../users.xml";
      
    4. Lesen Sie die XML-Datei in das in Schritt b erzeugte DataSet ds ein.

          FileStream fs = new FileStream(Server.MapPath(userFile), 
              FileMode.Open,FileAccess.Read);
          StreamReader reader = new StreamReader(fs);
          ds.ReadXml(reader);
          fs.Close();
      
    5. Lassen Sie den Hashwert des Kennworts berechnen und fügen Sie den neuen Namen und das Hashkennwort in das DataSet ds ein.

      string hashedpwd =    
          FormsAuthentication.HashPasswordForStoringInConfigFile
              (UserPass.Value, "SHA1");
          DataRow newUser = ds.Tables[0].NewRow();
          newUser["UserEmail"] = UserEmail.Value;
          newUser["UserPassword"] = hashedpwd;
          ds.Tables[0].Rows.Add(newUser);
          ds.AcceptChanges();
      
    6. Schreiben Sie den neuen DataSet mit dem neuen Namen und dem Kennwort in die XML-Datei.

          fs = new FileStream(Server.MapPath(userFile), FileMode.Create, 
              FileAccess.Write|FileAccess.Read);
          StreamWriter writer = new StreamWriter(fs);
          ds.WriteXml(writer);
          writer.Close();
          fs.Close();
      
    7. Leiten Sie die Anforderung zur ursprünglich angeforderten Ressource (Default.aspx) um, und starten Sie den Anmeldeprozess noch einmal. Mit Ausnahme des Schaltflächennamens ist dieses Formular mit dem bereits für die Datei Logon.aspx beschriebenen Formular identisch.

          Response.Redirect("../Default.aspx");
      }
      </script>
      <body>
      <form runat=server>
          <div style="background:#ccccff">
              <h3><font face="Verdana">Add New User</font></h3>
          </div>
      
      <table>
        <tr>
            <td>Name:</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>    
            <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>
            <td>Persistent Forms:</td>
            <td><ASP:CheckBox id=Persist runat="server"
                              autopostback="true"/>
            </td>
        </tr>
    </table>

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

Siehe auch

Sicherheit für ASP.NET-Webanwendungen | Formularauthentifizierung mit Hilfe einer Benutzerdatei im XML-Format