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
Özgün ü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
- Visual Studio .NET'i açın.
- 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.
Çözüm Gezgini'da Web.config dosyasını açın.
Kimlik doğrulama modunu Forms olarak değiştirin.
<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>
Bölümde anonim kullanıcıya
<authorization>
erişimi aşağıdaki gibi reddedin:<authorization> <deny users ="?" /> <allow users = "*" /> </authorization>
Kullanıcı 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.
Başlat menüsünde Çalıştır'ı seçin ve not defteri yazarak Not Defteri'ni açın.
Aşağıdaki SQL betik kodunu vurgulayın, koda sağ tıklayın ve kopyala'yı seçin. Aşağıdaki kodu yapıştırmak için Not Defteri'nde Düzenle menüsünde Yapıştır'ı seçin:
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
Dosyayı Users.sql olarak kaydedin.
SQL Server bilgisayarında Sorgu Çözümleyicisi'nde Users.sql açın. Veritabanları listesinden pub'lar'ı seçin ve betiği çalıştırın. Bu işlem örnek bir kullanıcılar tablosu oluşturur ve bu örnek uygulamayla kullanılacak Pubs veritabanındaki tabloyu doldurur.
Logon.aspx sayfası oluşturma
Projeye Logon.aspx adlı yeni bir Web Formu ekleyin.
Düzenleyicide Logon.aspx sayfasını açın ve HTML görünümüne geçin.
Aşağıdaki kodu kopyalayın ve etiketlerin arasına
<form>
kodu eklemek için Düzenle menüsündeki 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.
Daha fazla bilgi için bkz . RequiredFieldValidator Sınıfı.
Tasarım görünümüne geçin ve sayfayı kaydedin.
Kullanıcı kimlik bilgilerini doğrulayacak şekilde olay işleyicisini kodlayın
Bu bölümde arka planda kod sayfasına (Logon.aspx.cs) yerleştirilen kod gösterilir.
Logon.aspx.cs dosyasını açmak için Oturum Aç'a çift tıklayın.
Gerekli ad alanlarını arka planda kod dosyasında içeri aktarın:
using System.Data.SqlClient; using System.Web.Security;
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ğinizdenConnection
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 )); }
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 veriler 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); }
Web Formu Tasarımcısı'nın oluşturduğu kodda yöntemine
InitializeComponent
aşağıdaki kodun eklendiğinden 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.
Mevcut WebForm1.aspx sayfasını Default.aspx olarak yeniden adlandırın ve düzenleyicide açın.
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.
Tasarım görünümüne geçin ve sayfayı kaydedin.
Gerekli ad alanlarını arka planda kod dosyasında içeri aktarın:
using System.Web.Security;
Arka planda kod sayfasını (Default.aspx.cs) açmak için Oturumu Kapat'a çift tıklayın 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); }
Web Formu Tasarımcısı'nın oluşturduğu kodda yöntemine
InitializeComponent
aşağıdaki kodun eklendiğinden emin olun:this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
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 veritabanında oturum açmalarına izin vermeyecek şekilde bir bayrak ayarlamak isteyebilirsiniz. Ayrıca, gerektiğinde uygun hata işlemeyi 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 yanıltmaması için bu uygulamada Güvenli Yuva Katmanı (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 ilk olarak kendileri için tasarlanmamış bir ara 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.