Implementera formulärbaserad autentisering i ett ASP.NET program med hjälp av C#.NET
Den här artikeln visar hur du implementerar formulärbaserad autentisering med hjälp av en databas för att lagra användarna. Den refererar till följande namnområden för Microsoft .NET Framework-klassbibliotek:
System.Data.SqlClient
System.Web.Security
Ursprunglig produktversion: ASP.NET
Ursprungligt KB-nummer: 301240
Krav
I följande lista beskrivs de rekommenderade maskinvaru-, programvaru-, nätverksinfrastruktur- och servicepaket som du behöver:
- Visual Studio .NET
- Internet Information Services (IIS) version 5.0 eller senare
- SQL Server
Skapa ett ASP.NET program med hjälp av C# .NET
- Öppna Visual Studio .NET.
- Skapa en ny ASP.NET webbapp och ange namn och plats.
Konfigurera säkerhetsinställningar i web.config-filen
Det här avsnittet visar hur du lägger till och ändrar konfigurationsavsnitten <authentication>
och <authorization>
för att konfigurera ASP.NET-programmet att använda formulärbaserad autentisering.
Öppna filen Web.config i Istraživač rešenja.
Ändra autentiseringsläget till Formulär.
Infoga taggen
<Forms>
och fyll i lämpliga attribut. Kopiera följande kod och välj sedan Klistra in som HTML på menyn Redigera för att klistra in koden i<authentication>
avsnittet i filen:<authentication mode="Forms"> <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" protection="All" path="/" timeout="30" /> </authentication>
Neka åtkomst till den anonyma användaren i
<authorization>
avsnittet på följande sätt:<authorization> <deny users ="?" /> <allow users = "*" /> </authorization>
Skapa en exempeldatabastabell för att lagra användarinformation
Det här avsnittet visar hur du skapar en exempeldatabas för att lagra användarnamn, lösenord och roll för användarna. Du behöver rollkolumnen om du vill lagra användarroller i databasen och implementera rollbaserad säkerhet.
På Start-menyn väljer du Kör och skriver anteckningar för att öppna Anteckningar.
Markera följande SQL-skriptkod, högerklicka på koden och välj sedan Kopiera. I Anteckningar väljer du Klistra in på menyn Redigera för att klistra in följande kod:
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
Spara filen som Users.sql.
Öppna Users.sql i Query Analyzer på SQL Server-datorn. I listan över databaser väljer du pubar och kör skriptet. Den här åtgärden skapar en exempelanvändartabell och fyller i tabellen i pubdatabasen som ska användas med det här exempelprogrammet.
Skapa en Logon.aspx sida
Lägg till ett nytt webbformulär i projektet med namnet Logon.aspx.
Öppna sidan Logon.aspx i redigeraren och växla till HTML-vyn.
Kopiera följande kod och använd alternativet Klistra in som HTML på menyn Redigera för att infoga koden mellan taggarna
<form>
:<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" />
Det här webbformuläret används för att presentera ett inloggningsformulär för användare så att de kan ange sitt användarnamn och lösenord för att logga in på programmet.
Mer information finns i Klassen RequiredFieldValidator.
Växla till designvyn och spara sidan.
Koda händelsehanteraren så att den verifierar autentiseringsuppgifterna för användaren
I det här avsnittet visas koden som placeras på sidan bakom koden (Logon.aspx.cs).
Dubbelklicka på Inloggning för att öppna filen Logon.aspx.cs .
Importera de nödvändiga namnrymderna i filen code-behind:
using System.Data.SqlClient; using System.Web.Security;
Skapa en
ValidateUser
funktion för att verifiera användarautentiseringsuppgifterna genom att titta i databasen. Se till att du ändrar strängen så att denConnection
pekar på databasen.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 )); }
Du kan använda någon av två metoder för att generera formulärautentiseringscookien och omdirigera användaren till en lämplig sida i
cmdLogin_ServerClick
händelsen. Exempelkod tillhandahålls för båda scenarierna. Använd någon av dem enligt dina behov.RedirectFromLoginPage
Anropa metoden för att automatiskt generera formulärautentiseringscookien och omdirigera användaren till en lämplig sida icmdLogin_ServerClick
händelsen: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); }
Generera autentiseringsbiljetten, kryptera den, skapa en cookie, lägg till den i svaret och omdirigera användaren. Den här åtgärden ger dig mer kontroll över hur du skapar cookien. Du kan också inkludera anpassade data tillsammans med
FormsAuthenticationTicket
i det här fallet.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); }
Kontrollera att följande kod har lagts till
InitializeComponent
i metoden i koden som webbformulärdesignern genererar:this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
Skapa en Default.aspx sida
Det här avsnittet skapar en testsida som användarna omdirigeras till när de har autentiserats. Om användarna bläddrar till den här sidan utan att först logga in på programmet omdirigeras de till inloggningssidan.
Byt namn på den befintliga WebForm1.aspx sidan som Default.aspx och öppna den i redigeraren.
Växla till HTML-vyn och kopiera följande kod mellan taggarna
<form>
:<input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
Den här knappen används för att logga ut från formulärautentiseringssessionen.
Växla till designvyn och spara sidan.
Importera de nödvändiga namnrymderna i filen code-behind:
using System.Web.Security;
Dubbelklicka på SignOut för att öppna sidan bakom koden (Default.aspx.cs) och kopiera följande kod i
cmdSignOut_ServerClick
händelsehanteraren:private void cmdSignOut_ServerClick(object sender, System.EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("logon.aspx", true); }
Kontrollera att följande kod har lagts till
InitializeComponent
i metoden i koden som webbformulärdesignern genererar:this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
Spara och kompilera projektet. Nu kan du använda programmet.
Ytterligare kommentarer
Du kanske vill lagra lösenord på ett säkert sätt i en databas. Du kan använda
FormsAuthentication
funktionen för klassverktyg med namnetHashPasswordForStoringInConfigFile
för att kryptera lösenorden innan du lagrar dem i databasen eller konfigurationsfilen.Du kanske vill lagra SQL-anslutningsinformationen i konfigurationsfilen (Web.config) så att du enkelt kan ändra den om det behövs.
Du kan överväga att lägga till kod för att förhindra att hackare som försöker använda olika kombinationer av lösenord loggar in. Du kan till exempel inkludera logik som endast accepterar två eller tre inloggningsförsök. Om användarna inte kan logga in i vissa försök kanske du vill ange en flagga i databasen så att de inte kan logga in förrän användarna återaktiverar sina konton genom att besöka en annan sida eller genom att anropa din supportrad. Du bör också lägga till lämplig felhantering när det behövs.
Eftersom användaren identifieras baserat på autentiseringscookien kanske du vill använda Secure Sockets Layer (SSL) i det här programmet så att ingen kan lura autentiseringscookien och annan värdefull information som överförs.
Formulärbaserad autentisering kräver att klienten accepterar eller aktiverar cookies i webbläsaren.
Timeout-parametern i konfigurationsavsnittet
<authentication>
styr intervallet då autentiseringscookien återskapas. Du kan välja ett värde som ger bättre prestanda och säkerhet.Vissa mellanliggande proxyservrar och cacheminnen på Internet kan cachelagrar webbserversvar som innehåller
Set-Cookie
rubriker, som sedan returneras till en annan användare. Eftersom formulärbaserad autentisering använder en cookie för att autentisera användare kan det här beteendet leda till att användarna oavsiktligt (eller avsiktligt) personifierar en annan användare genom att ta emot en cookie från en mellanliggande proxy eller cache som inte var avsedd för dem.