Aracılığıyla paylaş


Üyelik Kullanıcı Deposu ile Karşılaştırarak Kullanıcı Kimlik Bilgilerini Doğrulama (C#)

tarafından Scott Mitchell

Not

Bu makale yazıldığından beri, ASP.NET Üyelik sağlayıcılarının yerini ASP.NET Identity alır. Bu makalenin yazıldığı sırada öne çıkan Üyelik sağlayıcıları yerine ASP.NET Kimlik platformunu kullanmak için uygulamaları güncelleştirmenizi kesinlikle öneririz. ASP.NET Identity, ASP.NET Üyelik sistemine göre aşağıdakiler dahil olmak üzere çeşitli avantajlara sahiptir:

  • Daha iyi performans
  • Geliştirilmiş genişletilebilirlik ve test edilebilirlik
  • OAuth, OpenID Connect ve iki öğeli kimlik doğrulaması desteği
  • Talep Tabanlı Kimlik desteği
  • ASP.Net Core ile daha iyi birlikte çalışabilirlik

Kodu İndir veya PDF İndir

Bu öğreticide, hem program aracılığıyla hem de Oturum açma denetimini kullanarak kullanıcının kimlik bilgilerini Üyelik kullanıcı deposuna karşı doğrulamayı inceleyeceğiz. Ayrıca oturum açma denetiminin görünümünü ve davranışını özelleştirmeyi de inceleyeceğiz.

Giriş

Önceki öğreticide Üyelik çerçevesinde yeni bir kullanıcı hesabının nasıl oluşturulacağını inceledik. İlk olarak sınıfın MembershipCreateUser yöntemi aracılığıyla program aracılığıyla kullanıcı hesapları oluşturmaya baktık ve ardından CreateUserWizard Web denetimini kullanarak inceledik. Ancak, oturum açma sayfası şu anda sağlanan kimlik bilgilerini kullanıcı adı ve parola çiftlerinin sabit kodlanmış bir listesiyle doğrular. Üyelik çerçevesinin kullanıcı deposunda kimlik bilgilerini doğrulayacak şekilde oturum açma sayfasının mantığını güncelleştirmemiz gerekir.

Kullanıcı hesapları oluşturma gibi kimlik bilgileri de program aracılığıyla veya bildirim temelli olarak doğrulanabilir. Üyelik API'sinde, kullanıcının kimlik bilgilerini kullanıcı deposunda program aracılığıyla doğrulamaya yönelik bir yöntem bulunur. ASP.NET, kullanıcı adı ve parola için metin kutuları ve oturum açmak için bir düğme içeren bir kullanıcı arabirimi oluşturan Login Web denetimiyle birlikte gelir.

Bu öğreticide, hem program aracılığıyla hem de Oturum açma denetimini kullanarak kullanıcının kimlik bilgilerini Üyelik kullanıcı deposuna karşı doğrulamayı inceleyeceğiz. Ayrıca oturum açma denetiminin görünümünü ve davranışını özelleştirmeyi de inceleyeceğiz. Haydi başlayalım!

1. Adım: Kimlik Bilgilerini Üyelik Kullanıcı Deposunda Doğrulama

Form kimlik doğrulaması kullanan web siteleri için, kullanıcı bir oturum açma sayfasını ziyaret ederek ve kimlik bilgilerini girerek web sitesinde oturum açar. Bu kimlik bilgileri daha sonra kullanıcı deposuyla karşılaştırılır. Geçerliyse, kullanıcıya ziyaretçinin kimliğini ve orijinalliğini belirten bir güvenlik belirteci olan bir form kimlik doğrulama bileti verilir.

Bir kullanıcıyı Üyelik çerçevesine göre doğrulamak için sınıfının ValidateUser yöntemini kullanınMembership. ValidateUser yöntemi iki giriş parametresi username (ve password ) alır ve kimlik bilgilerinin geçerli olup olmadığını belirten bir Boole değeri döndürür. CreateUser Önceki öğreticide incelediğimiz yöntemde olduğu gibi, ValidateUser yöntem de gerçek doğrulamayı yapılandırılan Üyelik sağlayıcısına devreder.

belirtilen SqlMembershipProvider kullanıcının parolasını saklı yordam aracılığıyla aspnet_Membership_GetPasswordWithFormat alarak sağlanan kimlik bilgilerini doğrular. Kullanıcıların parolalarını üç biçimden birini kullanarak depoladığını SqlMembershipProvider hatırlayın: clear, encrypted veya hashed. aspnet_Membership_GetPasswordWithFormat Saklı yordam, parolayı ham biçiminde döndürür. Şifrelenmiş veya karma parolalar password için yöntemine SqlMembershipProviderValidateUser geçirilen değeri eşdeğer şifrelenmiş veya karma durumuna dönüştürür ve ardından veritabanından döndürülen değerle karşılaştırır. Veritabanında depolanan parola, kullanıcı tarafından girilen biçimlendirilmiş parolayla eşleşiyorsa, kimlik bilgileri geçerlidir.

Sağlanan kimlik bilgilerini Üyelik çerçevesi kullanıcı deposunda doğrulayacak şekilde oturum açma sayfamızı (~/Login.aspx) güncelleştirelim. Bu oturum açma sayfasını Form Kimlik Doğrulamasına Genel Bakış öğreticisinde, kullanıcı adı ve parola için iki TextBox ile bir arabirim, Beni Anımsa onay kutusu ve Oturum Aç düğmesi oluşturarak oluşturduk (bkz. Şekil 1). Kod, girilen kimlik bilgilerini kullanıcı adı ve parola çiftlerinin (Scott/password, Jisun/password ve Sam/password) sabit kodlanmış bir listesine göre doğrular.

Oturum Açma Sayfasının Arabiriminde İki Metin Kutusu, Bir CheckBoxList ve Bir Düğme Bulunur

Şekil 1: Oturum Açma Sayfasının Arabirimi İki TextBox, bir CheckBoxList ve Bir Düğme içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Oturum açma sayfasının kullanıcı arabirimi değişmeden kalabilir, ancak Oturum Aç düğmesinin Click olay işleyicisini kullanıcıyı Üyelik çerçevesi kullanıcı deposuna karşı doğrulayan kodla değiştirmemiz gerekir. Olay işleyicisini, kodunun aşağıdaki gibi görünmesi için güncelleştirin:

protected void LoginButton_Click(object sender, EventArgs e)
{
    // Validate the user against the Membership framework user store
    if (Membership.ValidateUser(UserName.Text, Password.Text))
    {
        // Log the user into the site
        FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
    }
    // If we reach here, the user's credentials were invalid
    InvalidCredentialsMessage.Visible = true;
}

Bu kod son derece basittir. Sağlanan kullanıcı adını ve parolayı Membership.ValidateUser geçirerek yöntemini çağırarak başlayacağız. Bu yöntem true döndürürse, kullanıcı sınıfın FormsAuthentication RedirectFromLoginPage yöntemi aracılığıyla sitede oturum açar. (Daha önce de belirttiğimiz gibiForms Kimlik Doğrulamasına Genel Bakış öğreticisi, FormsAuthentication.RedirectFromLoginPage forms kimlik doğrulama biletini oluşturur ve kullanıcıyı uygun sayfaya yönlendirir.) Ancak kimlik bilgileri geçersizse Etiket InvalidCredentialsMessage görüntülenir ve kullanıcıya kullanıcı adının veya parolasının yanlış olduğu bildirilir.

İşte bu kadar!

Oturum açma sayfasının beklendiği gibi çalışıp çalışmadığını test etmek için, önceki öğreticide oluşturduğunuz kullanıcı hesaplarından biriyle oturum açmayı deneyin. Ya da henüz bir hesap oluşturmadıysanız sayfadan ~/Membership/CreatingUserAccounts.aspx bir hesap oluşturun.

Not

Kullanıcı kimlik bilgilerini girip oturum açma sayfası formunu gönderdiğinde, parolası da dahil olmak üzere kimlik bilgileri İnternet üzerinden web sunucusuna düz metin olarak iletilir. Bu, ağ trafiğini koklayan tüm korsanların kullanıcı adını ve parolayı görebileceği anlamına gelir. Bunu önlemek için Güvenli Yuva Katmanları (SSL) kullanarak ağ trafiğini şifrelemek önemlidir. Bu, kimlik bilgilerinin (ve sayfanın HTML işaretlemesinin tamamının) tarayıcıdan ayrıldığı andan web sunucusu tarafından alınana kadar şifrelenmesini sağlar.

Üyelik Çerçevesi Geçersiz Oturum Açma Girişimlerini nasıl işler?

Bir ziyaretçi oturum açma sayfasına ulaştığında ve kimlik bilgilerini gönderdiğinde, tarayıcıları oturum açma sayfasına bir HTTP isteği gönderir. Kimlik bilgileri geçerliyse, HTTP yanıtı kimlik doğrulama anahtarını bir tanımlama bilgisine ekler. Bu nedenle, sitenize girmeye çalışan bir bilgisayar korsanı, oturum açma sayfasına geçerli bir kullanıcı adı ve parola tahmini ile kapsamlı http istekleri gönderen bir program oluşturabilir. Parola tahmini doğruysa, oturum açma sayfası kimlik doğrulama bileti tanımlama bilgisini döndürür ve bu noktada program geçerli bir kullanıcı adı/parola çifti ile karşılaştığını bilir. Deneme yanılma yoluyla, böyle bir program özellikle de parola zayıfsa kullanıcının parolasına rastlayabilir.

Bu tür deneme yanılma saldırılarını önlemek için Üyelik çerçevesi, belirli bir süre içinde belirli sayıda başarısız oturum açma girişimi olduğunda kullanıcıyı kilitler. Tam parametreler aşağıdaki iki Üyelik sağlayıcısı yapılandırma ayarıyla yapılandırılabilir:

  • maxInvalidPasswordAttempts - Hesap kilitlenmeden önceki süre içinde kullanıcı için kaç geçersiz parola girişimine izin verildiğinden belirler. Varsayılan değer 5'tir.
  • passwordAttemptWindow - Belirtilen sayıda geçersiz oturum açma girişiminin hesabın kilitlenmesine neden olacağı süreyi dakika cinsinden gösterir. Varsayılan değer 10'dur.

Bir kullanıcı kilitlenmişse, yönetici hesabının kilidini açana kadar oturum açamaz. Bir kullanıcı kilitlendiğinde, geçerli kimlik bilgileri sağlansa ValidateUser bile yöntemi her zaman döndürür false. Bu davranış, bir korsanın deneme yanılma yöntemleriyle sitenize girme olasılığını azaltmakla birlikte, parolasını unutmuş veya yanlışlıkla Caps Lock'u açık olan veya kötü bir yazma günü geçiren geçerli bir kullanıcıyı kilitleyebilir.

Ne yazık ki, bir kullanıcı hesabının kilidini açmak için yerleşik bir araç yoktur. Bir hesabın kilidini açmak için veritabanını doğrudan değiştirebilir, uygun kullanıcı hesabının tablosundaki aspnet_Membership alanı değiştirebilir IsLockedOut veya kilitli hesapların kilidini açma seçenekleriyle birlikte listeleyen web tabanlı bir arabirim oluşturabilirsiniz. Gelecekteki bir öğreticide ortak kullanıcı hesabı ve rolle ilgili görevleri gerçekleştirmek için yönetim arabirimleri oluşturmayı inceleyeceğiz.

Not

Yöntemin ValidateUser bir dezavantajı, sağlanan kimlik bilgileri geçersiz olduğunda nedenine ilişkin herhangi bir açıklama sağlamamasıdır. Kullanıcı deposunda eşleşen kullanıcı adı/parola çifti olmadığından veya kullanıcı henüz onaylanmadığından veya kullanıcı kilitlendiğinden kimlik bilgileri geçersiz olabilir. 4. Adımda, oturum açma girişimi başarısız olduğunda kullanıcıya daha ayrıntılı bir iletinin nasıl gösterileceğini göreceğiz.

2. Adım: Oturum Açma Web Denetimi aracılığıyla Kimlik Bilgilerini Toplama

Login Web denetimi, Form Kimlik Doğrulamasına Genel Bakış öğreticisinde oluşturduğumuz kullanıcı arabirimine çok benzer bir varsayılan kullanıcı arabirimi oluşturur. Oturum açma denetimini kullanmak, ziyaretçinin kimlik bilgilerini toplamak için arabirimi oluşturma işini bize kaydeder. Ayrıca, Oturum açma denetimi kullanıcıda otomatik olarak oturum açar (gönderilen kimlik bilgilerinin geçerli olduğu varsayılarak), böylece herhangi bir kod yazmak zorunda kalmamızı engeller.

el ile oluşturulan arabirimi ve kodu bir Oturum açma denetimiyle değiştirerek öğesini güncelleştirelim Login.aspx. içindeki mevcut işaretlemeyi ve kodu Login.aspxkaldırarak başlayın. Doğrudan silebilir veya açıklama satırı yapmanız yeterlidir. Bildirim temelli işaretlemeyi açıklama satırı yapmak için ve --%> sınırlayıcılarıyla <%-- çevreleyebilirsiniz. Bu sınırlayıcıları el ile girebilir veya Şekil 2'de gösterildiği gibi açıklama satırı yapmak için metni seçip Araç Çubuğu'nda Seçili satırları açıklama satırı simgesine tıklayabilirsiniz. Benzer şekilde, arka kod sınıfındaki seçili kodu açıklama satırı yapmak için Seçili satırları açıklama satırına açıklama satırı ekle simgesini kullanabilirsiniz.

Login.aspx'te Var Olan Bildirim temelli Biçimlendirme ve Kaynak Kodu Açıklama Satırı Yapın

Şekil 2: içindeki Mevcut Bildirim temelli biçimlendirme ve kaynak kodu Login.aspx açıklama satırı (tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Visual Studio 2005'te bildirim temelli işaretleme görüntülenirken seçili satırları açıklama satırı simgesi kullanılamaz. Visual Studio 2008 kullanmıyorsanız ve --%> sınırlayıcılarını <%-- el ile eklemeniz gerekir.

Ardından, araç kutusundan bir Oturum açma denetimini sayfaya sürükleyin ve özelliğini olarak myLoginayarlayınID. Bu noktada ekranınız Şekil 3'e benzer görünmelidir. Oturum açma denetiminin varsayılan arabiriminde kullanıcı adı ve parola için TextBox denetimleri, bir sonraki sefere beni anımsa Onay Kutusu ve Oturum Aç Düğmesi yer alır. İki TextBox için denetimler de RequiredFieldValidator vardır.

Sayfaya Oturum Açma Denetimi Ekleme

Şekil 3: Sayfaya Oturum Açma Denetimi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ve işimiz bitti! Oturum Açma denetiminin Oturum Aç düğmesine tıklandığında bir geri gönderme gerçekleşir ve Oturum açma denetimi, girilen kullanıcı adı ve parolayı geçirerek yöntemini çağırır Membership.ValidateUser . Kimlik bilgileri geçersizse, Oturum açma denetimi bunu belirten bir ileti görüntüler. Ancak kimlik bilgileri geçerliyse, Oturum açma denetimi forms kimlik doğrulama anahtarını oluşturur ve kullanıcıyı uygun sayfaya yönlendirir.

Oturum açma denetimi, başarılı bir oturum açma işleminin ardından kullanıcıyı yönlendirmek için uygun sayfayı belirlemek için dört faktör kullanır:

  • Oturum açma denetiminin, form kimlik doğrulaması yapılandırmasında ayarlanarak loginUrl tanımlanan şekilde oturum açma sayfasında olup olmadığı; bu ayarın varsayılan değeri Login.aspx
  • Querystring parametresinin ReturnUrl varlığı
  • Oturum açma denetiminin özelliğininDestinationUrl değeri
  • defaultUrl Form kimlik doğrulaması yapılandırma ayarlarında belirtilen değer; bu ayarın varsayılan değeriDefault.aspx

Şekil 4'te Oturum Açma denetiminin uygun sayfa kararına ulaşmak için bu dört parametreyi nasıl kullandığı gösterilmektedir.

Oturum açma denetimi, uygun sayfa kararına ulaşmak için dört parametre kullanır.

Şekil 4: Sayfaya Oturum Açma Denetimi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bir tarayıcı üzerinden siteyi ziyaret ederek ve Üyelik çerçevesinde mevcut bir kullanıcı olarak oturum açarak Oturum açma denetimini test etmek için biraz zaman ayırın.

Oturum açma denetiminin işlenmiş arabirimi yüksek oranda yapılandırılabilir. Görünümünü etkileyen bir dizi özellik vardır; Dahası, kullanıcı arabirimi öğelerinin düzeni üzerinde hassas denetim için Oturum açma denetimi bir şablona dönüştürülebilir. Bu adımın geri kalanında görünümün ve düzenin nasıl özelleştirileceği incelendi.

Oturum Açma Denetiminin Görünümünü Özelleştirme

Oturum açma denetiminin varsayılan özellik ayarları, kullanıcı adı ve parola girişleri için bir başlık ( Oturum Aç ), Metin Kutusu ve Etiket denetimleri, bir sonraki seferde beni anımsa Onay Kutusu ve Oturum Aç düğmesi olan bir kullanıcı arabirimini işler. Bu öğelerin görünümlerinin tümü, Oturum Açma denetiminin çok sayıda özelliği aracılığıyla yapılandırılabilir. Ayrıca, yeni kullanıcı hesabı oluşturmak için bir sayfa bağlantısı gibi ek kullanıcı arabirimi öğeleri, bir veya iki özellik ayarlanarak eklenebilir.

Oturum açma denetimimizin görünümünü daha iyi görmek için birkaç dakika harcayalım. Login.aspx Sayfanın en üstünde Oturum Aç yazan bir metin bulunduğundan, Oturum açma denetiminin başlığı gereksizdir. Bu nedenle, Oturum açma denetiminin TitleText başlığını kaldırmak için özellik değerini temizleyin.

İki TextBox denetiminin sol kısmındaki Kullanıcı Adı: ve Parola: Etiketleri sırasıyla ve PasswordLabelText özellikleri aracılığıyla UserNameLabelText özelleştirilebilir. Şimdi Kullanıcı Adı: Etiket'i Kullanıcı Adı: okunacak şekilde değiştirelim. Label ve TextBox stilleri sırasıyla ve TextBoxStyle özellikleri aracılığıyla LabelStyle yapılandırılabilir.

CheckBox'ın Text özelliğinin Oturum açma denetiminin RememberMeText propertyaracılığıyla ayarlanabildiği bir sonraki seferde beni anımsa özelliği ve varsayılan denetlenen durumu aracılığıyla yapılandırılabilir RememberMeSet property (varsayılan olarak False olur). Devam edin ve özelliği True olarak ayarlayın RememberMeSet ; böylece CheckBox varsayılan olarak bir sonraki sefer beni hatırla seçeneği işaretlenir.

Oturum açma denetimi, kullanıcı arabirimi denetimlerinin düzenini ayarlamak için iki özellik sunar. , TextLayout property Kullanıcı Adı: ve Parola: Etiketlerinin karşılık gelen TextBox'larının solunda mı (varsayılan) yoksa üstlerinde mi göründüğünü gösterir. , Orientation property kullanıcı adı ve parola girişlerinin dikey (biri diğerinin üstünde) veya yatay olarak yerleştirilip yerleştirilemediğini gösterir. Bu iki özelliği varsayılan değerlerine ayarlı olarak bırakacağım, ancak sonuçta elde edilen etkiyi görmek için bu iki özelliği varsayılan olmayan değerlerine ayarlamayı denemenizi tavsiye ederim.

Not

Sonraki bölümde, Oturum Açma Denetiminin Düzenini Yapılandırma bölümünde, Düzen denetiminin kullanıcı arabirimi öğelerinin tam düzenini tanımlamak için şablonları kullanmayı inceleyeceğiz.

ve CreateUserUrl özelliklerini Henüz kaydedilmedi olarak ayarlayarak Oturum açma denetiminin CreateUserText özellik ayarları sarmalansın mı? Hesap oluşturun! ve ~/Membership/CreatingUserAccounts.aspxsırasıyla . Bu, önceki öğreticide oluşturduğumuz sayfaya işaret eden Oturum Açma denetiminin arabirimine bir köprü ekler. Oturum açma denetiminin HelpPageText ve HelpPageUrl özellikleri ile PasswordRecoveryTextPasswordRecoveryUrl özellikleri aynı şekilde çalışır ve bir yardım sayfasına ve parola kurtarma sayfasına bağlantılar işler.

Bu özellik değişikliklerini yaptıktan sonra, Oturum açma denetiminizin bildirim temelli işaretlemesi ve görünümü Şekil 5'te gösterilene benzer görünmelidir.

Oturum Açma Denetiminin Özelliklerinin Değerleri Görünümünü Dikte Eder

Şekil 5: Oturum Açma Denetimi Özelliklerinin Değerleri Görünümünü Dikte Eder (tam boyutlu görüntüyü görüntülemek için tıklayın)

Oturum Açma Denetiminin Düzenini Yapılandırma

Login Web denetiminin varsayılan kullanıcı arabirimi, arabirimini bir HTML <table>içinde hazırlar. Peki işlenen çıkış üzerinde daha hassas bir denetime ihtiyacımız olursa ne olacak? Belki yerine bir dizi <div> etiket eklemek <table> isteyebiliriz. Ya da uygulamamız kimlik doğrulaması için ek kimlik bilgileri gerektiriyorsa ne olur? Örneğin birçok finansal web sitesi, kullanıcıların yalnızca kullanıcı adı ve parolayı değil, kişisel kimlik numarası (PIN) veya diğer tanımlayıcı bilgileri de sağlamasını gerektirir. Nedenler ne olursa olsun, Oturum açma denetimini, arabirimin bildirim temelli işaretlemesini açıkça tanımlayabildiğimiz bir şablona dönüştürmek mümkündür.

Ek kimlik bilgilerini toplamak üzere Oturum açma denetimini güncelleştirmek için iki şey yapmamız gerekir:

  1. Ek kimlik bilgilerini toplamak için Oturum açma denetiminin arabirimini Web denetimlerini içerecek şekilde güncelleştirin.
  2. Kullanıcının yalnızca kullanıcı adı ve parolası geçerliyse ve ek kimlik bilgileri de geçerliyse kimlik doğrulamasının yapılabilmesi için Oturum açma denetiminin iç kimlik doğrulama mantığını geçersiz kılın.

İlk görevi gerçekleştirmek için Oturum açma denetimini şablona dönüştürmemiz ve gerekli Web denetimlerini eklememiz gerekir. İkinci göreve gelince, denetimin olayı için bir olay işleyicisi oluşturularak Oturum açma denetiminin Authenticatekimlik doğrulama mantığının yerini alabilir.

Oturum açma denetimini, kullanıcılardan kullanıcı adlarını, parolalarını ve e-posta adreslerini isteyecek ve yalnızca sağlanan e-posta adresi dosyadaki e-posta adresleriyle eşleşiyorsa kullanıcının kimliğini doğrulayan şekilde güncelleştirelim. Öncelikle Oturum açma denetiminin arabirimini bir şablona dönüştürmemiz gerekir. Oturum açma denetiminin Akıllı Etiketi'nden Şablona dönüştür seçeneğini belirleyin.

Oturum Açma Denetimini Şablona Dönüştürme

Şekil 6: Oturum Açma Denetimini Şablona Dönüştürme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Oturum açma denetimini şablon öncesi sürümüne geri döndürmek için denetimin Akıllı Etiketi'nden Sıfırla bağlantısına tıklayın.

Oturum açma denetimini şablona dönüştürmek, denetimin bildirim temelli işaretlemesine HTML öğeleri ve kullanıcı arabirimini tanımlayan Web denetimleri ile ekler LayoutTemplate . Şekil 7'de gösterildiği gibi, denetimi şablona dönüştürmek, Özellikler penceresi , vb. gibi TitleTextCreateUserUrlbir dizi özelliği kaldırır, çünkü bu özellik değerleri şablon kullanılırken yoksayılır.

Oturum Açma Denetimi Şablona Dönüştürüldüğünde Daha Az Özellik Kullanılabilir

Şekil 7: Oturum Açma Denetimi Şablona Dönüştürüldüğünde Daha Az Özellik Kullanılabilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

içindeki LayoutTemplate HTML işaretlemesi gerektiğinde değiştirilebilir. Benzer şekilde, şablona yeni Web denetimleri de ekleyebilirsiniz. Ancak, Oturum açma denetiminin temel Web denetimlerinin şablonda kalması ve atanmış ID değerlerini tutması önemlidir. Özellikle, veya Password TextBoxes, CheckBox, RememberMe Button, FailureTextLoginButton Label veya denetimleri kaldırmayın veya RequiredFieldValidator yeniden adlandırmayınUserName.

Ziyaretçinin e-posta adresini toplamak için şablona bir TextBox eklememiz gerekir. TextBox'ı içeren tablo satırı (<tr>) ile Beni bir sonraki sefer hatırla Onay Kutusu'nu Password tutan tablo satırı () arasına aşağıdaki bildirim temelli işaretlemeyi ekleyin:

<tr>
 <td align="right">
 <asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">Email:</asp:Label>
 </td>
 <td>
 <asp:TextBox ID="Email" runat="server"></asp:TextBox>
 <asp:RequiredFieldValidator ID="EmailRequired" runat="server" 
 ControlToValidate="Email" ErrorMessage="Email is required." 
 ToolTip="Email is required." ValidationGroup="myLogin">*</asp:RequiredFieldValidator>
 </td>
</tr>

TextBox'ı Email ekledikten sonra sayfayı tarayıcı üzerinden ziyaret edin. Şekil 8'de gösterildiği gibi, Oturum açma denetiminin kullanıcı arabirimi artık üçüncü bir metin kutusu içerir.

Oturum Açma Denetimi Artık Kullanıcının Email Adresi İçin Bir Metin Kutusu Içeriyor

Şekil 8: Oturum Açma Denetimi Artık Kullanıcının Email Adresi için Bir Metin Kutusu Içeriyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu noktada, Oturum açma denetimi sağlanan kimlik bilgilerini doğrulamak için yöntemini kullanmaya Membership.ValidateUser devam eder. Buna karşılık, TextBox'a girilen değerin Email kullanıcının oturum açıp açamayacağıyla ilgisi yoktur. 3. Adımda, kimlik bilgilerinin yalnızca kullanıcı adı ve parola geçerliyse ve sağlanan e-posta adresi dosyadaki e-posta adresiyle eşleşiyorsa geçerli olarak kabul edilmesi için Oturum açma denetiminin kimlik doğrulama mantığını nasıl geçersiz kılacağımıza bakacağız.

3. Adım: Oturum Açma Denetiminin Kimlik Doğrulama Mantığını Değiştirme

Bir ziyaretçi kimlik bilgilerini sağladığında ve Oturum Aç düğmesine tıkladığında, bir geri gönderme başlatılır ve Oturum açma denetimi kimlik doğrulaması iş akışında ilerler. İş akışı, olayı yükselterek LoggingInbaşlar. Bu olayla ilişkili tüm olay işleyicileri özelliğini trueolarak ayarlayarak e.Cancel oturum açma işlemini iptal edebilir.

Oturum açma işlemi iptal edilmediyse, iş akışı olayı yükselterek Authenticateilerler. Olay için Authenticate bir olay işleyicisi varsa, sağlanan kimlik bilgilerinin geçerli olup olmadığını belirlemek bu durumdan sorumludur. Hiçbir olay işleyicisi belirtilmezse, Oturum açma denetimi kimlik bilgilerinin geçerliliğini belirlemek için yöntemini kullanır Membership.ValidateUser .

Sağlanan kimlik bilgileri geçerliyse form kimlik doğrulama bileti oluşturulur, LoggedIn olay oluşturulur ve kullanıcı uygun sayfaya yönlendirilir. Ancak kimlik bilgileri geçersiz kabul edilirse olayLoginError tetiklenir ve kullanıcıya kimlik bilgilerinin geçersiz olduğunu bildiren bir ileti görüntülenir. Varsayılan olarak, hata durumunda Oturum Açma denetimi yalnızca Etiket denetiminin Text özelliğini bir hata iletisine ayarlar FailureText ( Oturum açma girişiminiz başarılı değildi. Lütfen yeniden deneyin). Ancak, Oturum açma denetiminin FailureAction özelliği olarak RedirectToLoginPageayarlanırsa, Oturum açma denetimi querystring parametresini loginfailure=1 ekleyerek oturum açma sayfasına bir Response.Redirect gönderir (bu da Oturum açma denetiminin hata iletisini görüntülemesine neden olur).

Şekil 9'da kimlik doğrulaması iş akışının akış çizelgesi sunulmaktadır.

Oturum Açma Denetiminin Kimlik Doğrulama İş Akışı

Şekil 9: Oturum Açma Denetiminin Kimlik Doğrulama İş Akışı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

'nin RedirectToLogin sayfa seçeneğini ne zaman kullanacağınızı FailureActionmerak ediyorsanız aşağıdaki senaryoyu göz önünde bulundurun. Şu anda ana sayfamızda Site.master , anonim bir kullanıcı tarafından ziyaret edildiğinde sol sütunda Hello, yabancı metni görüntüleniyor, ancak bu metni bir Oturum açma denetimiyle değiştirmek istediğimizi düşünün. Bu, anonim bir kullanıcının doğrudan oturum açma sayfasını ziyaret etmelerini gerektirmek yerine sitedeki herhangi bir sayfadan oturum açmasına olanak tanır. Ancak, bir kullanıcı ana sayfa tarafından işlenen Oturum açma denetimi aracılığıyla oturum açamadıysa, bu sayfa büyük olasılıkla ana sayfaya eklenmemiş ek yönergeler, bağlantılar ve başka yardım (yeni hesap oluşturma veya kayıp parola alma bağlantıları gibi) içerdiğinden, bu kullanıcıyı oturum açma sayfasına (Login.aspx) yönlendirmek mantıklı olabilir.

Olay İşleyicisiAuthenticateOluşturma

Özel kimlik doğrulama mantığımızı eklemek için Oturum açma denetiminin Authenticate olayı için bir olay işleyicisi oluşturmamız gerekir. Olay için bir olay işleyicisi Authenticate oluşturmak aşağıdaki olay işleyici tanımını oluşturur:

protected void myLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
}

Gördüğünüz gibi, olay işleyicisine Authenticate ikinci giriş parametresi olarak türünde AuthenticateEventArgs bir nesne geçirilir. sınıfı, AuthenticateEventArgs sağlanan kimlik bilgilerinin geçerli olup olmadığını belirtmek için kullanılan adlı Authenticated bir Boole özelliği içerir. Bu durumda görevimiz, sağlanan kimlik bilgilerinin geçerli olup olmadığını belirleyen kodu buraya yazmak ve özelliği buna göre ayarlamaktır e.Authenticate .

Sağlanan Kimlik Bilgilerini Belirleme ve Doğrulama

Kullanıcı tarafından girilen kullanıcı adı ve parola kimlik bilgilerini belirlemek için Oturum açma denetiminin UserName ve Password özelliklerini kullanın. Ek Web denetimlerine girilen değerleri belirlemek için (önceki adımda eklediğimiz TextBox gibiEmail), özelliği değerine eşit olan ID şablondaki Web denetimine programlı bir başvuru elde etmek controlIDiçin ("controlID") kullanınLoginControlID.FindControl. Örneğin, TextBox'a başvuru almak için Email aşağıdaki kodu kullanın:

TextBox EmailTextBox = myLogin.FindControl("Email") as TextBox;

Kullanıcının kimlik bilgilerini doğrulamak için iki şey yapmamız gerekir:

  1. Sağlanan kullanıcı adı ve parolanın geçerli olduğundan emin olun
  2. Girilen e-posta adresinin, oturum açmaya çalışan kullanıcının dosyasındaki e-posta adresiyle eşleştiğinden emin olun

İlk denetimi gerçekleştirmek için 1. Adımda gördüğümüz yöntemi kullanabiliriz Membership.ValidateUser . İkinci denetim için kullanıcının e-posta adresini belirlememiz gerekir, böylece bunu TextBox denetimine girdiği e-posta adresiyle karşılaştırabiliriz. Belirli bir kullanıcı hakkında bilgi almak için sınıfının GetUser yöntemini kullanınMembership.

GetUser yönteminde bir dizi aşırı yükleme vardır. Herhangi bir parametre geçirmeden kullanılırsa, şu anda oturum açmış olan kullanıcı hakkındaki bilgileri döndürür. Belirli bir kullanıcı hakkında bilgi almak için kullanıcı adını geçirmeyi arayın GetUser . Her iki durumda da , GetUserEmail, , IsApprovedIsOnlineve gibi UserNameözellikleri olan bir MembershipUser nesne döndürür.

Aşağıdaki kod bu iki denetimi uygular. Her ikisi de geçerse, e.Authenticate olarak ayarlanır true, aksi takdirde atanır false.

protected void myLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
    // Get the email address entered
    TextBox EmailTextBox = myLogin.FindControl("Email") as TextBox;
    string email = EmailTextBox.Text.Trim();

    // Verify that the username/password pair is valid
    if (Membership.ValidateUser(myLogin.UserName, myLogin.Password))
    {
        // Username/password are valid, check email
        MembershipUser usrInfo = Membership.GetUser(myLogin.UserName);
        if (usrInfo != null && string.Compare(usrInfo.Email, email, true) == 0)
        {
            // Email matches, the credentials are valid
            e.Authenticated = true;
        }
        else
        {
            // Email address is invalid...
            e.Authenticated = false;
        }
    }
    else
    {
        // Username/password are not valid...
        e.Authenticated = false;
    }
}

Bu kod uygulandığında, doğru kullanıcı adını, parolayı ve e-posta adresini girerek geçerli bir kullanıcı olarak oturum açmayı deneyebilirsiniz. Yeniden deneyin, ancak bu kez bilerek yanlış bir e-posta adresi kullanın (bkz. Şekil 10). Son olarak, var olmayan bir kullanıcı adı kullanarak üçüncü kez deneyin. İlk durumda sitede başarıyla oturum açmış olmanız gerekir, ancak son iki durumda Oturum açma denetiminin geçersiz kimlik bilgileri iletisini görmeniz gerekir.

Yanlış Email Adresi Girildiğinde Tito Oturum Açamıyor

Şekil 10: Yanlış Email Adresi Sağlarken Tito Oturum Açamıyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

1. Adımdaki Üyelik Çerçevesi Geçersiz Oturum Açma Denemelerini İşleme bölümünde açıklandığı gibi, yöntem çağrıldığında ve geçersiz kimlik bilgileri geçirildiğinde Membership.ValidateUser , geçersiz oturum açma girişimini izler ve belirli bir zaman penceresinde belirli bir geçersiz deneme eşiğini aşarsa kullanıcıyı kilitler. Özel kimlik doğrulama mantığımız yöntemini çağırdığından ValidateUser , geçerli bir kullanıcı adı için yanlış bir parola geçersiz oturum açma deneme sayacını artırır, ancak kullanıcı adı ve parolanın geçerli olduğu durumlarda bu sayaç artırılmaz, ancak e-posta adresi yanlıştır. Bir korsanın kullanıcı adını ve parolayı bilmesi mümkün olmadığından ancak kullanıcının e-posta adresini belirlemek için deneme yanılma tekniklerini kullanması gerekeceğinden, bu davranış uygundur.

4. Adım: Oturum Açma Denetiminin Geçersiz Kimlik Bilgileri İletisini İyileştirme

Kullanıcı geçersiz kimlik bilgileriyle oturum açmayı denediğinde, Oturum Açma denetimi oturum açma girişiminin başarısız olduğunu açıklayan bir ileti görüntüler. Özellikle, denetim özelliği tarafından FailureTextbelirtilen iletiyi görüntüler ve varsayılan değeri Oturum açma girişiminiz başarılı değildi şeklindedir. Lütfen tekrar deneyin.

Bir kullanıcının kimlik bilgilerinin geçersiz olmasının birçok nedeni olduğunu hatırlayın:

  • Kullanıcı adı mevcut olmayabilir
  • Kullanıcı adı var, ancak parola geçersiz
  • Kullanıcı adı ve parola geçerli, ancak kullanıcı henüz onaylanmadı
  • Kullanıcı adı ve parola geçerli, ancak kullanıcı kilitlendi (büyük olasılıkla belirtilen zaman dilimi içindeki geçersiz oturum açma girişimlerinin sayısını aştığından)

Özel kimlik doğrulama mantığını kullanmanın başka nedenleri de olabilir. Örneğin, 3. Adımda yazdığımız kodla kullanıcı adı ve parola geçerli olabilir, ancak e-posta adresi yanlış olabilir.

Kimlik bilgilerinin neden geçersiz olduğuna bakılmaksızın, Oturum Açma denetimi aynı hata iletisini görüntüler. Bu geri bildirim eksikliği, hesabı henüz onaylanmamış veya kilitlenmiş bir kullanıcı için kafa karıştırıcı olabilir. Ancak biraz çalışmayla Oturum açma denetiminin daha uygun bir ileti görüntülemesini sağlayabiliriz.

Bir kullanıcı geçersiz kimlik bilgileriyle oturum açmayı deneyışında Oturum Açma denetimi olayı tetikler LoginError . Devam edin ve bu olay için bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

protected void myLogin_LoginError(object sender, EventArgs e)
{
    // Determine why the user could not login...
    myLogin.FailureText = "Your login attempt was not successful. Please try again.";

    // Does there exist a User account for this user?
    MembershipUser usrInfo = Membership.GetUser(myLogin.UserName);
    if (usrInfo != null)
    {
        // Is this user locked out?
        if (usrInfo.IsLockedOut)
        {
            myLogin.FailureText = "Your account has been locked out because of too many invalid login attempts. Please contact the administrator to have your account unlocked.";
        }
        else if (!usrInfo.IsApproved)
        {
            myLogin.FailureText = "Your account has not yet been approved. You cannot login until an administrator has approved your account.";
        }
    }
}

Yukarıdaki kod, Oturum açma denetiminin FailureText özelliğini varsayılan değere ayarlayarak başlar ( Oturum açma girişiminiz başarılı değildi. Lütfen yeniden deneyin). Ardından sağlanan kullanıcı adının mevcut bir kullanıcı hesabıyla eşlenip eşlemediğini denetler. Bu durumda, hesabın kilitlenip kilitlenmediğini veya henüz onaylanmadığını belirlemek için sonuçta elde edilen MembershipUser nesnenin IsLockedOut ve IsApproved özelliklerine başvurur. Her iki durumda FailureText da özelliği karşılık gelen bir değere güncelleştirilir.

Bu kodu test etmek için, bilerek var olan bir kullanıcı olarak oturum açmayı, ancak yanlış bir parola kullanmayı deneme. Bunu 10 dakikalık bir zaman dilimi içinde arka arkaya beş kez yapın, hesap kilitlenir. Şekil 11'de gösterildiği gibi, sonraki oturum açma girişimleri her zaman başarısız olur (doğru parolayla bile) ancak artık çok fazla geçersiz oturum açma girişimi nedeniyle hesabınız kilitlendi ifadesini daha açıklayıcı görüntüler. Hesabınızın kilidinin açık olması için lütfen yöneticiye başvurun.

Tito Çok Fazla Geçersiz Oturum Açma Denemesi Gerçekleştirdi ve Kilitlendi

Şekil 11: Tito Çok Fazla Geçersiz Oturum Açma Girişimi Gerçekleştirdi ve Kilitlendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özet

Bu öğreticiden önce, oturum açma sayfamız sağlanan kimlik bilgilerini kullanıcı adı/parola çiftlerinin sabit kodlanmış bir listesine göre doğrulamıştı. Bu öğreticide, üyelik çerçevesine göre kimlik bilgilerini doğrulamak için sayfayı güncelleştirdik. 1. Adımda yöntemini program aracılığıyla kullanmayı Membership.ValidateUser inceledik. 2. Adımda el ile oluşturulan kullanıcı arabirimimizi ve kodumuzu Oturum açma denetimiyle değiştirdik.

Oturum açma denetimi standart bir oturum açma kullanıcı arabirimini işler ve kullanıcının kimlik bilgilerini Üyelik çerçevesine göre otomatik olarak doğrular. Ayrıca, geçerli kimlik bilgileri durumunda Oturum açma denetimi kullanıcının form kimlik doğrulaması aracılığıyla oturum açmasını sağlar. Kısacası, oturum açma denetimini bir sayfaya sürükleyerek, fazladan bildirim temelli işaretleme veya kod gerekmemesiyle tam işlevsel bir oturum açma kullanıcı deneyimi sağlanır. Dahası, Oturum açma denetimi yüksek oranda özelleştirilebilir ve hem işlenen kullanıcı arabirimi hem de kimlik doğrulama mantığı üzerinde hassas bir denetim sağlar.

Bu noktada web sitemizin ziyaretçileri yeni bir kullanıcı hesabı oluşturabilir ve sitede oturum açabilir, ancak kimliği doğrulanmış kullanıcıya göre sayfalara erişimi kısıtlamaya henüz bakmadık. Şu anda kimliği doğrulanmış veya anonim olan tüm kullanıcılar sitemizdeki herhangi bir sayfayı görüntüleyebilir. Sitemizin sayfalarına erişimi kullanıcı bazında denetlemenin yanı sıra, işlevselliği kullanıcıya bağlı olan belirli sayfalarımız olabilir. Sonraki öğreticide, oturum açmış kullanıcıya göre erişimin ve sayfa içi işlevselliğin nasıl sınırlandırıldığı ele alınmaktadır.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Yazar hakkında

Birden çok ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Scott'a adresinden mitchell@4guysfromrolla.com veya adresinden blogu http://ScottOnWriting.NETaracılığıyla ulaşılabilir.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri Teresa Murphy ve Michael Olivero'ydı. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır mitchell@4GuysFromRolla.combırakın.