Verificatie op basis van formulieren implementeren in een ASP.NET-toepassing met behulp van C#.NET

In dit artikel ziet u hoe u verificatie op basis van formulieren implementeert met behulp van een database om de gebruikers op te slaan. Het verwijst naar de volgende Microsoft .NET Framework Class Library-naamruimten:

  • System.Data.SqlClient
  • System.Web.Security

Oorspronkelijke productversie: ASP.NET
Origineel KB-nummer: 301240

Vereisten

In de volgende lijst vindt u een overzicht van de aanbevolen hardware, software, netwerkinfrastructuur en servicepacks die u nodig hebt:

  • Visual Studio .NET
  • Internet Information Services (IIS) versie 5.0 of hoger
  • SQL Server

Een ASP.NET-toepassing maken met behulp van C# .NET

  1. Open Visual Studio .NET.
  2. Maak een nieuwe ASP.NET webtoepassing en geef de naam en locatie op.

Beveiligingsinstellingen configureren in het Web.config-bestand

In deze sectie ziet u hoe u de <authentication> configuratiesecties en <authorization> toevoegt en wijzigt om de ASP.NET-toepassing te configureren voor het gebruik van verificatie op basis van formulieren.

  1. Open in Solution Explorer het Web.config-bestand.

  2. Wijzig de verificatiemodus in Formulieren.

  3. Voeg de <Forms> tag in en vul de juiste kenmerken in. Kopieer de volgende code en selecteer plakken als HTML in het menu Bewerken om de code in de <authentication> sectie van het bestand te plakken:

    <authentication mode="Forms">
        <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx"
            protection="All" path="/" timeout="30" />
    </authentication>
    
  4. Weiger de toegang tot de anonieme gebruiker in de <authorization> sectie als volgt:

    <authorization>
        <deny users ="?" />
        <allow users = "*" />
    </authorization>
    

Een voorbeelddatabasetabel maken om gebruikersgegevens op te slaan

In deze sectie wordt beschreven hoe u een voorbeelddatabase maakt om de gebruikersnaam, het wachtwoord en de rol voor de gebruikers op te slaan. U hebt de rolkolom nodig als u gebruikersrollen wilt opslaan in de database en beveiliging op basis van rollen wilt implementeren.

  1. Selecteer in het menu Startde optie Uitvoeren en typ kladblok om Kladblok te openen.

  2. Markeer de volgende SQL-scriptcode, klik met de rechtermuisknop op de code en selecteer Kopiëren. Selecteer in Kladblok plakken in het menu Bewerken om de volgende code te plakken:

    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. Sla het bestand op als Users.sql.

  4. Open Users.sql op de SQL Server computer in Query Analyzer. Selecteer pubs in de lijst met databases en voer het script uit. Met deze bewerking maakt u een voorbeeldtabel met gebruikers en vult u de tabel in de pubs-database voor gebruik met deze voorbeeldtoepassing.

Een Logon.aspx-pagina maken

  1. Voeg een nieuw webformulier toe aan het project met de naam Logon.aspx.

  2. Open de pagina Logon.aspx in de editor en schakel over naar de HTML-weergave.

  3. Kopieer de volgende code en gebruik de optie Plakken als HTML in het menu Bewerken om de code tussen de <form> tags in te voegen:

    <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" />
    

    Dit webformulier wordt gebruikt om gebruikers een aanmeldingsformulier te presenteren, zodat ze hun gebruikersnaam en wachtwoord kunnen opgeven om zich aan te melden bij de toepassing.

  4. Schakel over naar de ontwerpweergave en sla de pagina op.

Codeer de gebeurtenis-handler zodat deze de gebruikersreferenties valideert

In deze sectie wordt de code weergegeven die op de achter de codepagina (Logon.aspx.cs) wordt geplaatst.

  1. Dubbelklik op Aanmelden om het Logon.aspx.cs-bestand te openen.

  2. Importeer de vereiste naamruimten in het code-behind-bestand:

    using System.Data.SqlClient;
    using System.Web.Security;
    
  3. Maak een ValidateUser functie om de gebruikersreferenties te valideren door in de database te zoeken. Zorg ervoor dat u de Connection tekenreeks wijzigt zodat deze verwijst naar uw database.

    private bool ValidateUser( string userName, string passWord )
    {
        SqlConnection conn;
        SqlCommand cmd;
        string lookupPassword = null;
    
        // Check for invalid userName.
        // userName must not be null and must be between 1 and 15 characters.
        if ( ( null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ))
        {
            System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
            return false;
        }
    
        // Check for invalid passWord.
        // passWord must not be null and must be between 1 and 25 characters.
        if ( ( null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ))
        {
            System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
            return false;
        }
    
        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 users table given 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 = (string) cmd.ExecuteScalar();
    
            // Cleanup command and connection objects.
            cmd.Dispose();
            conn.Dispose();
        }
        catch ( Exception ex )
        {
            // 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 );
        }
    
        // If no password found, return false.
        if ( null == lookupPassword )
        {
            // You could write failed login attempts here to event log for additional security.
            return false;
        }
    
        // Compare lookupPassword and input passWord, using a case-sensitive comparison.
        return ( 0 == string.Compare( lookupPassword, passWord, false ));
    }
    
  4. U kunt een van de twee methoden gebruiken om de formulierverificatiecooky te genereren en de gebruiker in de cmdLogin_ServerClick gebeurtenis om te leiden naar een geschikte pagina. Voor beide scenario's wordt voorbeeldcode verstrekt. Gebruik een van beide op basis van uw behoeften.

    • Roep de RedirectFromLoginPage methode aan om automatisch de formulierverificatiecooky te genereren en de gebruiker om te leiden naar een geschikte pagina in het cmdLogin_ServerClick geval:

      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
          if (ValidateUser(txtUserName.Value,txtUserPass.Value))
              FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, chkPersistCookie.Checked);
          else
              Response.Redirect("logon.aspx", true);
      }
      
    • Genereer het verificatieticket, versleutel het, maak een cookie, voeg deze toe aan het antwoord en leid de gebruiker om. Met deze bewerking hebt u meer controle over hoe u de cookie maakt. U kunt ook aangepaste gegevens opnemen, samen met de FormsAuthenticationTicket in dit geval.

      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
          if (ValidateUser(txtUserName.Value,txtUserPass.Value))
          {
              FormsAuthenticationTicket tkt;
              string cookiestr;
              HttpCookie ck;
              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)
                  ck.Expires=tkt.Expiration;
              ck.Path = FormsAuthentication.FormsCookiePath;
              Response.Cookies.Add(ck);
      
              string strRedirect;
              strRedirect = Request["ReturnUrl"];
              if (strRedirect==null)
                  strRedirect = "default.aspx";
              Response.Redirect(strRedirect, true);
          }
          else
              Response.Redirect("logon.aspx", true);
      }
      
  5. Zorg ervoor dat de volgende code wordt toegevoegd aan de InitializeComponent methode in de code die het webformulier Designer genereert:

    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
    

Een Default.aspx-pagina maken

In deze sectie wordt een testpagina gemaakt waarnaar gebruikers worden omgeleid nadat ze zijn geverifieerd. Als gebruikers naar deze pagina bladeren zonder zich eerst aan te melden bij de toepassing, worden ze omgeleid naar de aanmeldingspagina.

  1. Wijzig de naam van de bestaande WebForm1.aspx pagina als Default.aspx en open deze in de editor.

  2. Schakel over naar de HTML-weergave en kopieer de volgende code tussen de <form> tags:

    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    

    Deze knop wordt gebruikt om u af te melden bij de verificatiesessie voor formulieren.

  3. Schakel over naar de ontwerpweergave en sla de pagina op.

  4. Importeer de vereiste naamruimten in het code-behind-bestand:

    using System.Web.Security;
    
  5. Dubbelklik op Afmelden om de achter de codepagina (Default.aspx.cs) te openen en kopieer de volgende code in de cmdSignOut_ServerClick gebeurtenis-handler:

    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
        FormsAuthentication.SignOut();
        Response.Redirect("logon.aspx", true);
    }
    
  6. Zorg ervoor dat de volgende code wordt toegevoegd aan de InitializeComponent methode in de code die het webformulier Designer genereert:

    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    
  7. Sla het project op en compileer het. U kunt nu de toepassing gebruiken.

Aanvullende notities

  • U kunt wachtwoorden veilig opslaan in een database. U kunt de functie van het klassehulpprogramma met de FormsAuthentication naam HashPasswordForStoringInConfigFile gebruiken om de wachtwoorden te versleutelen voordat u ze opslaat in de database of het configuratiebestand.

  • Mogelijk wilt u de SQL-verbindingsgegevens opslaan in het configuratiebestand (Web.config), zodat u deze indien nodig eenvoudig kunt wijzigen.

  • U kunt overwegen code toe te voegen om te voorkomen dat hackers die verschillende combinaties van wachtwoorden gebruiken zich aanmelden. U kunt bijvoorbeeld logica opnemen die slechts twee of drie aanmeldingspogingen accepteert. Als gebruikers zich niet kunnen aanmelden bij sommige pogingen, kunt u een vlag instellen in de database zodat ze zich niet kunnen aanmelden totdat de gebruikers hun account opnieuw inschakelen door naar een andere pagina te gaan of door uw ondersteuningslijn te bellen. U moet ook waar nodig de juiste foutafhandeling toevoegen.

  • Omdat de gebruiker wordt geïdentificeerd op basis van de verificatiecookie, wilt u mogelijk SSL (Secure Sockets Layer) gebruiken voor deze toepassing, zodat niemand de verificatiecookie en andere waardevolle informatie die wordt verzonden, kan misleiden.

  • Voor verificatie op basis van formulieren moet uw client cookies accepteren of inschakelen in hun browser.

  • De time-outparameter van de <authentication> configuratiesectie bepaalt het interval waarmee de verificatiecooky opnieuw wordt gegenereerd. U kunt een waarde kiezen die betere prestaties en beveiliging biedt.

  • Bepaalde tussenliggende proxy's en caches op internet kunnen webserverantwoorden in de cache opslaan die headers bevatten Set-Cookie , die vervolgens worden geretourneerd naar een andere gebruiker. Omdat verificatie op basis van formulieren gebruikmaakt van een cookie om gebruikers te verifiëren, kan dit gedrag ertoe leiden dat gebruikers per ongeluk (of opzettelijk) een andere gebruiker imiteren door een cookie te ontvangen van een tussenliggende proxy of cache die oorspronkelijk niet voor hen was bedoeld.

Verwijzingen