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
- 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 Web.configdosyası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ı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.
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. 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
Dosyayı Users.sql olarak kaydedin.
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
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ü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.
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.
Logon.aspx.cs dosyasını açmak için Oturum Aç'a çift tıklayın.
Arka planda kod dosyasında gerekli ad alanlarını 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 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); }
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.
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.
Arka planda kod dosyasında gerekli ad alanlarını içeri aktarın:
using System.Web.Security;
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); }
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);
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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin