ASP.NET Uygulamanızda C# .NET Kullanarak Form Tabanlı Kimlik Doğrulaması Uygulama


Özet


Bu makalede, kullanıcıların depolamak için bir veritabanı kullanarak form tabanlı kimlik doğrulaması uygulamak gösterilmiştir.

Gereksinimleri

Aşağıdaki listede önerilen donanım, yazılım, ağ altyapısı ve gereken hizmet paketleri önerilmektedir:
  • Microsoft Visual Studio .NET
  • Microsoft Internet Information Services (IIS) sürüm 5.0 veya üstü
  • Microsoft SQL Server

C# .NET kullanarak bir ASP.NET uygulamasını oluşturmak

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

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

Bu bölümde ASP.NET uygulaması, form tabanlı kimlik doğrulamasını kullanacak biçimde yapılandırmak için < kimlik doğrulama > ve < Yetkilendirme > yapılandırma bölümleri değiştirmek ve eklemek gösterilmiştir.
  1. Solution Explorer'da, Web.config dosyasını açın.
  2. Formlarkimlik doğrulama modunu değiştirin.
  3. < Form > etiketi ekleyin ve uygun öznitelikleri doldurun. (Bu öznitelikler hakkında daha fazla bilgi için MSDN belgelerine veya listelenen QuickStart belgelerine bakın
    REFERANSLAR bölümü.) Aşağıdaki kodu kopyalayın ve sonra üzerinde HTML olarak Yapıştır ' ı tıklatın
    Kod dosyasının < kimlik > bölümünde yapıştırmak için Düzen menüsünde:
    <authentication mode="Forms">   <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
    protection="All" path="/" timeout="30" />
    </authentication>

  4. Anonim kullanıcı < Yetkilendirme > bölümünde aşağıdaki gibi erişimini:
    <authorization>   <deny users ="?" />
    <allow users = "*" />
    </authorization>

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

Bu bölümde, kullanıcı adı, parola ve kullanıcılar için rol depolamak için bir örnek veritabanı oluşturulması gösterilmiştir. Kullanıcı rolleri veritabanında depolamak ve rol tabanlı güvenliği uygulamak istiyorsanız, rol sütun gerekir.
  1. Başlat menüsünde'ı tıklatın.
    Çalıştırınve sonra türü Not Not Defteri'ni açmak için.
  2. Aşağıdaki SQL komut dosyası kodu vurgulayın, kodunu sağ tıklatın ve ardından Kopyala' yı tıklatın. Not Defteri'nde,'ı tıklatın.
    Aşağıdaki kodu yapıştırmak için Yapıştır Düzen menüsünde:
    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 kaydedin.
  4. Microsoft SQL Server bilgisayarda Users.sql Sorgu Çözümleyicisi'nde açın. Veritabanları listesinden pubstıklatın ve komut dosyasını çalıştırın. Bu örnek bir kullanıcı tablo oluşturur ve bu örnek uygulama ile kullanılmak üzere Pubs veritabanındaki tablo doldurur.

Logon.aspx sayfa oluşturma

  1. Logon.aspx adlı projeye yeni bir Web formu ekleyin.
  2. Logon.aspx sayfasına düzenleyicisinde açın ve HTML görünümüne geçin.
  3. Aşağıdaki kodu kopyalayın ve kod < form > etiketleri arasına eklemek için Düzen menüsünden 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 kendi kullanıcı adı ve parola uygulamaya oturum sağlayabilir, böylece bir oturum açma formu sunmak için kullanılır.
  4. Tasarım görünümüne geçin ve sayfayı kaydedin.

Böylece kullanıcı kimlik bilgilerini doğrular, olay işleyicisini kod

Bu bölüm arka plan kod sayfasında (Logon.aspx.cs) yerleştirilen kod sunar.
  1. Oturum açma Logon.aspx.cs dosyayı açmak için çift tıklatın.
  2. Arka plan kod dosyasında gerekli isim uzaylarını içeri aktarın:
    using System.Data.SqlClient;using System.Web.Security;

  3. Veritabanında bakarak kullanıcı kimlik bilgilerini doğrulamak için ValidateUser bir işlev oluşturun. (Bağlantı dizesi, veritabanına işaret edecek şekilde değiştirdiğinizden 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. Formlar kimlik doğrulama tanımlama bilgisini oluşturur ve kullanıcı cmdLogin_ServerClick olayı içinde uygun bir sayfaya yeniden yönlendirmek için iki yöntemden birini kullanabilirsiniz. Her iki senaryo için örnek kod sağlanmıştır. Bunları gereksinimlerinize göre birini kullanın.
    • Otomatik olarak form kimlik doğrulaması tanımlama bilgisi oluşturmak ve kullanıcı cmdLogin_ServerClick olayı içinde uygun bir sayfaya yeniden yönlendirmek için RedirectFromLoginPage yöntemi çağırın:
      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 bileti oluşturur, şifrelemeden, bir tanımlama bilgisi yaratır, yanıtı eklemek ve kullanıcıyı yeniden yönlendirmek. Bu tanımlama bilgisi oluşturmak nasıl daha fazla kontrol sağlar. Bu durumda FormsAuthenticationTicket yanı sıra özel veri de içerebilir.
      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 Form Tasarımcısı oluşturur kod InitializeComponent yöntemine aşağıdaki kodu eklendiğinden emin olun:
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);

Default.aspx sayfasını oluşturma

Bu bölümde, kullanıcıların kimlik doğrulaması sonra kullanıcılar yönlendirilir bir sınama sayfası oluşturur. Kullanıcılar uygulamayı ilk açmadan bu sayfaya göz atarsanız, bunlar oturum açma sayfasına yönlendirilir.
  1. WebForm1.aspx sayfasının varolan Default.aspx olarak yeniden adlandırın ve düzenleyicisinde açın.
  2. HTML görünümüne geçin ve < form > etiketleri arasına aşağıdaki kodu kopyalayın:
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    Bu düğme, forms kimlik doğrulaması oturumunu için kullanılır.
  3. Tasarım görünümüne geçin ve sayfayı kaydedin.
  4. Arka plan kod dosyasında gerekli isim uzaylarını içeri aktarın:
    using System.Web.Security;
  5. Arka plan kod sayfasını (Default.aspx.cs) açmak için SignOut çift tıklatın ve cmdSignOut_ServerClick olay işleyicisine aşağıdaki kodu kopyalayın:
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e){
    FormsAuthentication.SignOut();
    Response.Redirect("logon.aspx", true);
    }

  6. Web Form Tasarımcısı oluşturur kod InitializeComponent yöntemine aşağıdaki kodu eklendiğinden emin olun:
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
  7. Kaydet ve projeyi derleyin. Artık uygulamayı kullanabilirsiniz.

Ek Notlar

  • Parolaları güvenli bir veritabanında depolamak isteyebilirsiniz. Veritabanı veya yapılandırma dosyasında depolamadan önce parolaları şifrelemek için HashPasswordForStoringInConfigFile adlı FormsAuthentication sınıfı yardımcı program işlevi kullanabilirsiniz.
  • Böylece kolayca gerekirse değiştirebilirsiniz SQL bağlantı bilgilerini yapılandırma dosyasında (Web.config) depolamak isteyebilirsiniz.
  • Oturum açma farklı birleşimlerini parolalar kullanmaya çalışan bilgisayar korsanları engellemek üzere kod ekleyerek düşünebilirsiniz. Örneğin, yalnızca iki veya üç oturum açma girişimlerini kabul mantığı ekleyebilirsiniz. Kullanıcı bir girişim sayısında oturum açamaz, kullanıcının kendi hesabına, Destek hattını arayarak veya farklı bir sayfa ziyaret tarafından yeniden etkinleştirmedikçe, oturum kullanıcı izin veritabanındaki bir bayrak ayarı isteyebilirsiniz. Ayrıca, gerekli olan her yerde uygun hata işleme eklemelisiniz.
  • Kullanıcı kimlik doğrulama tanımlama bilgisine göre tanımlandığından, böylece hiç kimse kandırmak kimlik doğrulama tanımlama bilgisi ve aktarılmasına neden herhangi bir değerli bilgiler bu uygulamayı Güvenli Yuva Katmanı (SSL) kullanmak isteyebilirsiniz.
  • Form tabanlı kimlik doğrulaması, istemci kabul edin veya kendi tarayıcı tanımlama bilgilerini etkinleştirmek gerektirir.
  • Zaman aşımı parametresi < kimlik > yapılandırma bölümünün hangi kimlik doğrulama tanımlama bilgisini yeniden aralığı kontrol eder. Daha iyi performans ve güvenlik olanakları sağlayan bir değer seçebilirsiniz.
  • Belirli bir ara proxy'ler ve Internet'teki önbellekleri Set-Cookie üstbilgileri, ardından başka bir kullanıcı tarafından döndürülen içeren Web sunucu yanıtlarının önbelleğe alabilir. Form tabanlı kimlik doğrulaması, kullanıcıların kimliklerini doğrulamak için bir tanımlama bilgisi kullandığından, bu kullanıcıların yanlışlıkla (veya kasıtlı olarak) aracı proxy veya bunlar için ilk olarak amaçlanmamış önbellek bir tanımlama bilgisi alma başka bir kullanıcının kimliğine bürünmek neden olabilir.

Başvurular


Kullanıcılar ve parolalar depolamak için < kimlik > bölümü kullanan basit form tabanlı kimlik doğrulaması uygulamak hakkında daha fazla bilgi için aşağıdaki GotDotNet ASP.NET QuickStart örneğe bakın:Kullanıcılar ve parolalar depolamak için bir XML dosyası kullanır, form tabanlı kimlik doğrulamasını gerçekleştirme hakkında daha fazla bilgi için aşağıdaki konuda .NET Framework Software Development Kit (SDK) belgelerine başvurun:
Kullanıcıların XML dosyası kullanarak form kimlik doğrulaması
http://msdn2.microsoft.com/en-us/library/1b1y85bh(vs.71).aspx
ASP.NET Web uygulaması güvenliği hakkında daha fazla bilgi için aşağıdaki Microsoft .NET Framework Geliştirici Kılavuzu belgelerine bakın:System.Web.Security ad alanı hakkında daha fazla bilgi için aşağıdaki Microsoft .NET Framework başvuru belgelerine bakın:ASP.NET yapılandırma hakkında daha fazla bilgi için aşağıdaki Microsoft .NET Framework Geliştirici Kılavuzu makalelere başvurun:ASP.NET güvenlik yönergeleri hakkında daha fazla bilgi için aşağıdaki MSDN teknik incelemeye bakın:
ASP.NET kimlik doğrulaması: .NET güvenlik kılavuzu
http://msdn2.microsoft.com/en-us/library/ms978378.aspx