Verificatie op basis van formulieren implementeren in een ASP.NET-toepassing met behulp van C#.NET
In dit artikel wordt gedemonstreerd hoe u verificatie op basis van formulieren implementeert met behulp van een database voor het opslaan van de gebruikers. Deze verwijst naar de volgende Naamruimten van Microsoft .NET Framework Class Library:
System.Data.SqlClient
System.Web.Security
Oorspronkelijke productversie: ASP.NET
Oorspronkelijk KB-nummer: 301240
Behoeften
De volgende lijst bevat een overzicht van de aanbevolen hardware, software, netwerkinfrastructuur en servicepacks die u nodig hebt:
- Visual Studio .NET
- IIS (Internet Information Services) versie 5.0 of hoger
- SQL Server
Een ASP.NET-toepassing maken met C# .NET
- Open Visual Studio .NET.
- 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>
secties en configuratiesecties toevoegt en <authorization>
wijzigt om de ASP.NET toepassing te configureren voor het gebruik van verificatie op basis van formulieren.
Open in Solution Explorer het web.config-bestand .
Wijzig de verificatiemodus in Formulieren.
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>
Toegang tot de anonieme gebruiker in de
<authorization>
sectie als volgt weigeren:<authorization> <deny users ="?" /> <allow users = "*" /> </authorization>
Een voorbeelddatabasetabel maken om gebruikersdetails op te slaan
In deze sectie ziet u 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 op rollen gebaseerde beveiliging wilt implementeren.
Selecteer Uitvoeren in het menu Start en typ kladblok om Kladblok te openen.
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
Sla het bestand op als Users.sql.
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 tabel met voorbeeldgebruikers en vult u de tabel in de Pubs-database die moet worden gebruikt met deze voorbeeldtoepassing.
Een Logon.aspx-pagina maken
Voeg een nieuw webformulier toe aan het project met de naam Logon.aspx.
Open de pagina Logon.aspx in de editor en schakel over naar de HTML-weergave.
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 voor het presenteren van een aanmeldingsformulier aan gebruikers, zodat ze hun gebruikersnaam en wachtwoord kunnen opgeven om zich aan te melden bij de toepassing.
Zie RequiredFieldValidator Class voor meer informatie.
Schakel over naar de ontwerpweergave en sla de pagina op.
Codeer de gebeurtenis-handler zodat de gebruikersreferenties worden gevalideerd
In deze sectie wordt de code weergegeven die wordt geplaatst op de pagina achter de code (Logon.aspx.cs).
Dubbelklik op Aanmelden om het bestand Logon.aspx.cs te openen.
Importeer de vereiste naamruimten in het code-behind-bestand:
using System.Data.SqlClient; using System.Web.Security;
Maak een
ValidateUser
functie om de gebruikersreferenties te valideren door in de database te zoeken. Zorg ervoor dat u deConnection
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 )); }
U kunt een van de twee methoden gebruiken om de cookie voor formulierverificatie te genereren en de gebruiker om te leiden naar een geschikte pagina in de
cmdLogin_ServerClick
gebeurtenis. Er wordt voorbeeldcode gegeven voor beide scenario's. Gebruik een van beide op basis van uw behoeften.Roep de
RedirectFromLoginPage
methode aan om automatisch de cookie voor formulierverificatie te genereren en de gebruiker om te leiden naar een geschikte pagina in decmdLogin_ServerClick
gebeurtenis: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 het toe aan het antwoord en leid de gebruiker om. Deze bewerking geeft 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); }
Zorg ervoor dat de volgende code is toegevoegd aan de
InitializeComponent
methode in de code die de Web Form 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.
Wijzig de naam van de bestaande WebForm1.aspx pagina als Default.aspx en open deze in de editor.
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 formulierverificatiesessie.
Schakel over naar de ontwerpweergave en sla de pagina op.
Importeer de vereiste naamruimten in het code-behind-bestand:
using System.Web.Security;
Dubbelklik op SignOut om de pagina achter code (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); }
Zorg ervoor dat de volgende code is toegevoegd aan de
InitializeComponent
methode in de code die de Web Form Designer genereert:this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
Sla het project op en compileer het. U kunt nu de toepassing gebruiken.
Aanvullende opmerkingen
U kunt wachtwoorden veilig opslaan in een database. U kunt de
FormsAuthentication
functie class utility gebruikenHashPasswordForStoringInConfigFile
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 zo nodig eenvoudig kunt wijzigen.
U kunt overwegen code toe te voegen om te voorkomen dat hackers die verschillende combinaties van wachtwoorden proberen aan te melden. U kunt bijvoorbeeld logica opnemen die slechts twee of drie aanmeldingspogingen accepteert. Als gebruikers zich niet kunnen aanmelden bij sommige pogingen, wilt u mogelijk een vlag instellen in de database zodat ze zich niet kunnen aanmelden totdat de gebruikers hun accounts opnieuw inschakelen door naar een andere pagina te gaan of door de ondersteuningslijn aan te roepen. Ook moet u waar nodig de juiste foutafhandeling toevoegen.
Omdat de gebruiker wordt geïdentificeerd op basis van de verificatiecookie, kunt u Secure Sockets Layer (SSL) voor deze toepassing gebruiken, zodat niemand de verificatiecookie en andere waardevolle informatie kan misleiden die wordt verzonden.
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 webserverreacties in de cache opslaan die headers bevatten
Set-Cookie
, die vervolgens worden geretourneerd aan 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 is bedoeld.