Dela via


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 den rekommenderade maskinvaran, programvaran, nätverksinfrastrukturen och servicepaketen 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

  1. Öppna Visual Studio .NET.
  2. 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.

  1. Öppna filenWeb.configi Solution Explorer.

  2. Ändra autentiseringsläget till Formulär.

  3. Infoga taggen <Forms> och fyll i lämpliga attribut. Kopiera följande kod och välj sedan Klistra in som HTMLpå redigera-menyn för att klistra in koden i avsnittet i <authentication> filen:

    <authentication mode="Forms">
        <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx"
            protection="All" path="/" timeout="30" />
    </authentication>
    
  4. Neka åtkomst till den anonyma användaren i avsnittet på <authorization> 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.

  1. Start-menyn väljer du Kör och skriver anteckningar för att öppna Anteckningar.

  2. Markera följande SQL-skriptkod, högerklicka på koden och välj sedan Kopiera. I Anteckningar väljer du Klistra inpå redigera-menyn 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
    
  3. Spara filen som Users.sql.

  4. Öppna Users.sql i Query Analyzer på den 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

  1. Lägg till ett nytt webbformulär i projektet med namnet Logon.aspx.

  2. Öppna sidan Logon.aspx i redigeraren och växla till HTML-vyn.

  3. Kopiera följande kod och använd alternativet Klistra in som HTMLpå redigera-menyn 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.

  4. Växla till designvyn och spara sidan.

Koda händelsehanteraren så att den verifierar användarens autentiseringsuppgifter

I det här avsnittet visas koden som placeras på sidan bakom koden (Logon.aspx.cs).

  1. Dubbelklicka på Inloggning för att öppna filen Logon.aspx.cs .

  2. Importera de nödvändiga namnrymderna i filen bakom koden:

    using System.Data.SqlClient;
    using System.Web.Security;
    
  3. Skapa en ValidateUser funktion för att verifiera användarens autentiseringsuppgifter genom att titta i databasen. Se till att du ändrar strängen så att den Connection 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 ));
    }
    
  4. Du kan använda någon av två metoder för att generera cookien för formulärautentisering 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 i cmdLogin_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);
      }
      
  5. Kontrollera att följande kod har lagts till i InitializeComponent metoden i koden som webbformuläret Designer 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.

  1. Byt namn på den befintliga WebForm1.aspx sidan som Default.aspx och öppna den i redigeraren.

  2. 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.

  3. Växla till designvyn och spara sidan.

  4. Importera de nödvändiga namnrymderna i filen bakom koden:

    using System.Web.Security;
    
  5. 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);
    }
    
  6. Kontrollera att följande kod har lagts till i InitializeComponent metoden i koden som webbformuläret Designer genererar:

    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    
  7. Spara och kompilera projektet. Nu kan du använda programmet.

Ytterligare anteckningar

  • Du kanske vill lagra lösenord på ett säkert sätt i en databas. Du kan använda klassverktygsfunktionen FormsAuthentication med namnet HashPasswordForStoringInConfigFile 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 bara 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å autentiseringscookie å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ändare oavsiktligt (eller avsiktligt) personifierar en annan användare genom att ta emot en cookie från en mellanliggande proxy eller cache som inte ursprungligen var avsedd för dem.

Referenser