C#.NET kullanarak bir ASP.NET uygulamasında form tabanlı kimlik doğrulaması uygulama

Bu makalede, kullanıcıları depolamak için veritabanı kullanarak form tabanlı kimlik doğrulamasının nasıl uygulandığı gösterilmektedir. Aşağıdaki Microsoft .NET Framework Sınıf Kitaplığı ad alanlarını ifade eder:

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

Orijinal ürün sürümü: ASP.NET
Özgün KB numarası: 301240

Gereksinimler

Aşağıdaki listede ihtiyacınız olan önerilen donanım, yazılım, ağ altyapısı ve hizmet paketleri özetlenmiştir:

  • Visual Studio .NET
  • Internet Information Services (IIS) sürüm 5.0 veya üzeri
  • SQL Server

C# .NET kullanarak ASP.NET uygulaması oluşturma

  1. Visual Studio .NET'i açın.
  2. Yeni bir ASP.NET Web uygulaması oluşturun ve adı ve konumu belirtin.

Web.config Dosyasında güvenlik ayarlarını yapılandırma

Bu bölümde, ASP.NET uygulamasını form tabanlı kimlik doğrulaması kullanacak şekilde yapılandırmak için ve yapılandırma bölümlerinin nasıl ekleneceği ve <authorization> değiştirileceği <authentication> gösterilmektedir.

  1. Çözüm Gezgini Web.configdosyasını açın.

  2. Kimlik doğrulama modunu Forms olarak değiştirin.

  3. <Forms> etiketini ekleyin ve uygun öznitelikleri doldurun. Aşağıdaki kodu kopyalayın ve ardından düzenle menüsünde HTML Olarak Yapıştır'ı<authentication> seçerek kodu dosyanın bölümüne yapıştırın:

    <authentication mode="Forms">
        <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx"
            protection="All" path="/" timeout="30" />
    </authentication>
    
  4. Bölümde anonim kullanıcıya <authorization> erişimi aşağıdaki gibi reddedin:

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

Kullanıcıların ayrıntılarını depolamak için örnek veritabanı tablosu oluşturma

Bu bölümde, kullanıcıların kullanıcı adını, parolasını ve rolünü depolamak için örnek veritabanı oluşturma gösterilmektedir. Kullanıcı rollerini veritabanında depolamak ve rol tabanlı güvenlik uygulamak istiyorsanız rol sütununa ihtiyacınız vardır.

  1. Başlat menüsünde Çalıştır'ı seçin ve not defteri yazarak Not Defteri'ni açın.

  2. Aşağıdaki SQL betik kodunu vurgulayın, koda sağ tıklayın ve kopyala'yı seçin. Not Defteri'nde Düzenle menüsünde Yapıştır'ı seçerek aşağıdaki kodu yapıştırın:

    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. Dosyayı Users.sql olarak kaydedin.

  4. SQL Server bilgisayarda Sorgu Çözümleyicisi'nde Users.sql açın. Veritabanları listesinden pub'lar'ı seçin ve betiği çalıştırın. Bu işlem bir örnek kullanıcılar tablosu oluşturur ve bu örnek uygulamayla kullanılacak Pubs veritabanındaki tabloyu doldurur.

Logon.aspx sayfası oluşturma

  1. Projeye Logon.aspx adlı yeni bir Web Formu ekleyin.

  2. Düzenleyicide Logon.aspx sayfasını açın ve HTML görünümüne geçin.

  3. Aşağıdaki kodu kopyalayın ve etiketlerin arasına <form> kodu eklemek için Düzenle menüsünde html olarak yapıştır seçeneğini kullanın:

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

    Bu Web Formu, kullanıcılara uygulamada oturum açmak için kullanıcı adlarını ve parolalarını sağlayabilmeleri için bir oturum açma formu sunmak için kullanılır.

  4. Tasarım görünümüne geçin ve sayfayı kaydedin.

Olay işleyicisini, kullanıcı kimlik bilgilerini doğrulayacak şekilde kodlayın

Bu bölümde arka planda kod sayfasına (Logon.aspx.cs) yerleştirilen kod gösterilir.

  1. Logon.aspx.cs dosyasını açmak için Oturum Aç'a çift tıklayın.

  2. Arka planda kod dosyasında gerekli ad alanlarını içeri aktarın:

    using System.Data.SqlClient;
    using System.Web.Security;
    
  3. Veritabanına bakarak kullanıcı kimlik bilgilerini doğrulamak için bir ValidateUser işlev oluşturun. Dizeyi veritabanınıza işaret eden şekilde değiştirdiğinizden Connection emin olun.

    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. Form kimlik doğrulama tanımlama bilgisini oluşturmak ve kullanıcıyı olaydaki uygun bir sayfaya yönlendirmek için iki yöntemden cmdLogin_ServerClick birini kullanabilirsiniz. Her iki senaryo için de örnek kod sağlanır. Gereksinimlerinize göre bunlardan birini kullanın.

    • RedirectFromLoginPage Form kimlik doğrulama tanımlama bilgisini otomatik olarak oluşturmak ve kullanıcıyı olaydaki uygun bir sayfaya yönlendirmek için yöntemini çağırıncmdLogin_ServerClick:

      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);
      }
      
    • Kimlik doğrulama anahtarını oluşturun, şifreleyin, bir tanımlama bilgisi oluşturun, yanıta ekleyin ve kullanıcıyı yeniden yönlendirin. Bu işlem, tanımlama bilgisini nasıl oluşturacağınız konusunda daha fazla denetim sağlar. Bu durumda ile FormsAuthenticationTicket birlikte özel verileri de ekleyebilirsiniz.

      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. Web Formu Tasarım Aracı oluşturduğu kodda yöntemine aşağıdaki kodun eklendiğinden InitializeComponent emin olun:

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

Default.aspx sayfası oluşturma

Bu bölüm, kullanıcıların kimlik doğrulaması yaptıktan sonra yeniden yönlendirildiği bir test sayfası oluşturur. Kullanıcılar uygulamada oturum açmadan bu sayfaya göz atarsa, oturum açma sayfasına yönlendirilirler.

  1. Mevcut WebForm1.aspx sayfasını Default.aspx olarak yeniden adlandırın ve düzenleyicide açın.

  2. HTML görünümüne geçin ve etiketler arasında <form> aşağıdaki kodu kopyalayın:

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

    Bu düğme, forms kimlik doğrulama oturumundan oturumu kapatmak için kullanılır.

  3. Tasarım görünümüne geçin ve sayfayı kaydedin.

  4. Arka planda kod dosyasında gerekli ad alanlarını içeri aktarın:

    using System.Web.Security;
    
  5. SignOut'a çift tıklayarak arka planda kod sayfasını açın (Default.aspx.cs) ve olay işleyicisinde cmdSignOut_ServerClick aşağıdaki kodu kopyalayın:

    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
        FormsAuthentication.SignOut();
        Response.Redirect("logon.aspx", true);
    }
    
  6. Web Formu Tasarım Aracı oluşturduğu kodda yöntemine aşağıdaki kodun eklendiğinden InitializeComponent emin olun:

    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    
  7. Projeyi kaydedin ve derleyin. Artık uygulamayı kullanabilirsiniz.

Ek notlar

  • Parolaları bir veritabanında güvenli bir şekilde depolamak isteyebilirsiniz. Parolaları FormsAuthentication veritabanında veya yapılandırma dosyasında depolamadan önce şifrelemek için adlı HashPasswordForStoringInConfigFile sınıf yardımcı programı işlevini kullanabilirsiniz.

  • Gerekirse kolayca değiştirebilmek için SQL bağlantı bilgilerini yapılandırma dosyasında (Web.config) depolamak isteyebilirsiniz.

  • Farklı parola bileşimlerini kullanmaya çalışan bilgisayar korsanlarının oturum açmasını önlemek için kod eklemeyi düşünebilirsiniz. Örneğin, yalnızca iki veya üç oturum açma girişimi kabul eden mantık ekleyebilirsiniz. Kullanıcılar bazı denemelerde oturum açamıyorsa, kullanıcılar farklı bir sayfayı ziyaret ederek veya destek hattınızı arayarak hesaplarını yeniden etkinleştirene kadar oturum açmalarına izin vermeyecek şekilde veritabanında bir bayrak ayarlamak isteyebilirsiniz. Ayrıca, gerekirse uygun hata işleme eklemeniz gerekir.

  • Kullanıcı kimlik doğrulama tanımlama bilgisine göre tanımlandığından, kimlik doğrulama tanımlama bilgisini ve iletilen diğer değerli bilgileri kimsenin aldatmaması için bu uygulamada Güvenli Yuva Katmanı 'nı (SSL) kullanmak isteyebilirsiniz.

  • Form tabanlı kimlik doğrulaması, istemcinizin tarayıcılarında tanımlama bilgilerini kabul etmelerini veya etkinleştirmelerini gerektirir.

  • Yapılandırma bölümünün zaman aşımı parametresi <authentication> , kimlik doğrulama tanımlama bilgisinin yeniden oluşturulduğu aralığı denetler. Daha iyi performans ve güvenlik sağlayan bir değer seçebilirsiniz.

  • İnternet'te bazı ara ara proxy'ler ve önbellekler, daha sonra farklı bir kullanıcıya döndürülen üst bilgiler içeren Set-Cookie Web sunucusu yanıtlarını önbelleğe alabilir. Form tabanlı kimlik doğrulaması, kullanıcıların kimliğini doğrulamak için bir tanımlama bilgisi kullandığından, bu davranış kullanıcıların başlangıçta kendileri için tasarlanmamış bir ara sunucu veya önbellekten tanımlama bilgisi alarak yanlışlıkla (veya kasıtlı olarak) başka bir kullanıcının kimliğine bürünmelerine neden olabilir.

Başvurular