Parolaları Kurtarma ve Değiştirme (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 kullanacak şekilde uygulamaları güncelleştirmenizi kesinlikle öneririz. ASP.NET Kimliği, 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

ASP.NET, parolaları kurtarma ve değiştirme konusunda yardımcı olacak iki Web denetimi içerir. PasswordRecovery denetimi, bir ziyaretçinin kayıp parolasını kurtarmasını sağlar. ChangePassword denetimi, kullanıcının parolasını güncelleştirmesine izin verir. Bu öğretici serisi boyunca gördüğümüz diğer Oturum Açma ile ilgili Web denetimleri gibi PasswordRecovery ve ChangePassword denetimleri de kullanıcıların parolalarını sıfırlamak veya değiştirmek için arka planda Üyelik çerçevesiyle çalışır.

Giriş

Bankam, hizmet şirketim, telefon şirketim, e-posta hesaplarım ve kişiselleştirilmiş web portallarım için web siteleri arasında, çoğu kişi gibi ben de hatırlanması gereken onlarca farklı parolam var. Bugünlerde ezberlemek için bu kadar çok kimlik bilgisi olduğundan, kişilerin parolalarını unutması nadir bir durum değildir. Bunu hesaba eklemek için, kullanıcı hesapları sunan web sitelerinin bir kullanıcının parolasını kurtarması için bir yol içermesi gerekir. Bu işlem genellikle yeni, rastgele bir parola oluşturmayı ve kullanıcının dosyadaki e-posta adresine e-postayla göndermeyi içerir. Kullanıcıların çoğu yeni parolalarını aldıktan sonra siteye geri döner ve parolalarını rastgele oluşturulan paroladan daha akılda kalıcı bir parolaya değiştirir.

ASP.NET, parolaları kurtarma ve değiştirme konusunda yardımcı olacak iki Web denetimi içerir. PasswordRecovery denetimi, bir ziyaretçinin kayıp parolasını kurtarmasını sağlar. ChangePassword denetimi, kullanıcının parolasını güncelleştirmesine izin verir. Bu öğretici serisi boyunca gördüğümüz diğer Oturum Açma ile ilgili Web denetimleri gibi PasswordRecovery ve ChangePassword denetimleri de kullanıcıların parolalarını sıfırlamak veya değiştirmek için arka planda Üyelik çerçevesiyle çalışır.

Bu öğreticide bu iki denetimi kullanarak inceleyeceğiz. Ayrıca, sınıfın ChangePassword ve ResetPassword yöntemleri aracılığıyla MembershipUser bir kullanıcının parolasını program aracılığıyla nasıl değiştirip sıfırlayacağımızı da göreceğiz.

1. Adım: Kullanıcıların Kayıp Parolaları Kurtarmalarını Sağlama

Kullanıcı hesaplarını destekleyen tüm web sitelerinin kullanıcılara unutulan parolalarını kurtarmak için bazı mekanizmalar sağlaması gerekir. İyi haber, PasswordRecovery Web denetimi sayesinde ASP.NET bu tür işlevlerin uygulanması çok kolaydır. PasswordRecovery denetimi, kullanıcıdan kullanıcı adını ve gerekirse güvenlik sorusunun yanıtını isteyen bir arabirim oluşturur. Ardından kullanıcıya parolasını e-postayla ile iletir.

Not

E-posta iletileri düz metin olarak kablo üzerinden iletildiğinden, kullanıcının parolasını e-postayla göndermeyle ilgili güvenlik riskleri vardır.

PasswordRecovery denetimi üç görünümden oluşur:

  • UserName - Ziyaretçiden kullanıcı adını ister. Bu, ilk görünümdür.
  • Soru- Kullanıcının kullanıcı adını ve güvenlik sorusunu metin olarak, kullanıcının güvenlik sorusunun yanıtını girmesi için textBox ile birlikte görüntüler.
  • Success- Kullanıcıya parolasının e-postayla gönderildiğini bildiren bir ileti görüntüler.

PasswordRecovery denetimi tarafından görüntülenen görünümler ve gerçekleştirilen eylemler aşağıdaki Üyelik yapılandırma ayarlarına bağlıdır:

  • RequiresQuestionAndAnswer
  • EnablePasswordRetrieval
  • EnablePasswordReset

Üyelik çerçevesinin RequiresQuestionAndAnswer ayarı, kullanıcıların bir hesaba kaydolduğunda bir güvenlik sorusu ve yanıtı belirtmesi gerekip gerekmediğini gösterir. Kullanıcı Hesapları Oluşturma öğreticisinde ele aldığımız gibi, True (varsayılan) ise RequiresQuestionAndAnswer CreateUserWizard arabirimi, yeni kullanıcının güvenlik sorusu ve yanıtı için TextBox denetimlerini içerir; False iseRequiresQuestionAndAnswer, böyle bir bilgi toplanmaz. Benzer şekilde, True ise RequiresQuestionAndAnswer PasswordRecovery denetimi kullanıcı kullanıcı adını girdikten sonra Soru görünümünü görüntüler; parola yalnızca kullanıcı doğru güvenlik yanıtını girerse kurtarılır. RequiresQuestionAndAnswer Ancak False ise, PasswordRecovery denetimi doğrudan UserName görünümünden Başarılı görünümüne taşınır.

Kullanıcı kullanıcı adını veya kullanıcı adını ve güvenlik yanıtını (True ise RequiresQuestionAndAnswer ) sağladıktan sonra PasswordRecovery kullanıcıya parolasını e-posta ile gönderir. EnablePasswordRetrieval Seçenek True olarak ayarlanırsa kullanıcıya geçerli parolası e-postayla gönderilir. False olarak ayarlanırsa ve EnablePasswordReset True olarak ayarlanırsa PasswordRecovery denetimi kullanıcı için yeni, rastgele bir parola oluşturur ve bu yeni parolayı onlara e-posta ile iletir. Hem EnablePasswordReset hem de EnablePasswordRetrieval False ise, PasswordRecovery denetimi bir özel durum oluşturur.

Not

Kullanıcıların parolalarını üç biçimden birinde depoladığını SqlMembershipProvider hatırlayın: Clear, Hashed (varsayılan) veya Encrypted. Kullanılan depolama mekanizması Üyelik yapılandırma ayarlarına bağlıdır; tanıtım uygulaması Karma parola biçimini kullanır. Karma parola biçimi EnablePasswordRetrieval kullanılırken, sistem veritabanında depolanan karma sürümden kullanıcının gerçek parolasını belirleyemediğinden seçeneğin False olarak ayarlanması gerekir.

Şekil 1'de PasswordRecovery arabiriminin ve davranışının Üyelik yapılandırmasından nasıl etkilediği gösterilmektedir.

RequiresQuestionAndAnswer, EnablePasswordRetrieval ve EnablePasswordReset, PasswordRecovery denetiminin Görünümünü ve Davranışını Etkiler

Şekil 1: RequiresQuestionAndAnswer, EnablePasswordRetrievalve EnablePasswordReset PasswordRecovery denetiminin Görünüm ve Davranışını Etkileme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

PasswordRecovery Denetimini Kullanma

Şimdi ASP.NET sayfasında PasswordRecovery denetimini kullanmaya bakalım. Bir PasswordRecovery denetimini Araç Kutusu'ndan Tasarımcı'ya açıp RecoverPassword.aspx sürükleyip bırakın; olarak ID RecoverPwdayarlayın. Login ve CreateUserWizard Web denetimleri gibi PasswordRecovery denetiminin görünümleri de Etiketler, Metin Kutuları, Düğmeler ve doğrulama denetimleri içeren zengin bir bileşik arabirim oluşturur. Görünümlerin görünümünü denetimin stil özellikleri aracılığıyla veya görünümleri şablonlara dönüştürerek özelleştirebilirsiniz. Bunu ilgili okuyucu için bir alıştırma olarak bırakıyorum.

Bir kullanıcı bu sayfayı ziyaret ettiğinde kullanıcı adını girer ve Gönder düğmesine tıklar. Üyelik yapılandırma ayarlarımızda özelliğini True olarak ayarladığımız RequiresQuestionAndAnswer için PasswordRecovery denetimi Soru görünümünü görüntüler. Kullanıcı doğru güvenlik yanıtını girip Gönder'e tıkladıktan sonra PasswordRecovery denetimi kullanıcının parolasını rastgele oluşturulan bir yanıtla güncelleştirir ve bu parolayı dosyadaki e-posta adresine e-postayla gönderir. Tüm bunlar tek bir kod satırı yazmamıza gerek kalmadan mümkündü!

Bu sayfayı test etmeden önce, ilgilenmeniz gereken son bir yapılandırma parçası vardır: içinde posta teslim ayarlarını Web.configbelirtmemiz gerekir. PasswordRecovery denetimi, e-postayı göndermek için bu ayarları kullanır.

Posta teslim yapılandırması öğenin<mailSettings> öğesi aracılığıyla <system.net> belirtilir. <smtp> öğesini kullanarak teslim yöntemini ve varsayılan Kimden adresini belirtin. Aşağıdaki işaretleme, posta ayarlarını 25 numaralı bağlantı noktasında adlı smtp.example.com bir ağ SMTP sunucusu kullanacak şekilde ve kullanıcı adı ve parola kullanıcı adı/parola kimlik bilgileriyle yapılandırır.

Not

<system.net> , kök <configuration> öğesinin alt öğesi ve eşdüzey öğesidir <system.web>. Bu nedenle, öğesini öğesinin içine koymayın <system.net> <system.web> ; bunun yerine aynı düzeye yerleştirin.

<configuration>
 ...
 <system.net>
 <mailSettings>
 <smtp deliveryMethod="Network" from="youraddress@example.com">
 <network
 host="smtp.example.com"
 userName="username"
 password="password"
 port="25" />
 </smtp>
 </mailSettings>
 </system.net>
</configuration>

Ağda SMTP sunucusu kullanmanın yanı sıra, alternatif olarak gönderilecek e-posta iletilerinin depolandığı bir teslim alma dizini belirtebilirsiniz.

SMTP ayarlarını yapılandırdıktan sonra tarayıcı üzerinden sayfayı RecoverPassword.aspx ziyaret edin. İlk olarak kullanıcı deposunda mevcut olmayan bir kullanıcı adı girmeyi deneyin. Şekil 2'de gösterildiği gibi PasswordRecovery denetimi, kullanıcı bilgilerine erişilemediğine dair bir ileti görüntüler. İletinin metni denetimin UserNameFailureText özelliği aracılığıyla özelleştirilebilir.

Geçersiz Kullanıcı Adı Girilirse Hata İletisi Görüntülenir

Şekil 2: Geçersiz Kullanıcı Adı Girilirse Hata İletisi Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Şimdi bir kullanıcı adı girin. Erişebileceğiniz ve güvenlik yanıtını bildiğiniz bir e-posta adresiyle sistemdeki bir hesabın kullanıcı adını kullanın. Kullanıcı adını girip Gönder'e tıkladıktan sonra PasswordRecovery denetimi Soru görünümünü görüntüler. UserName görünümünde olduğu gibi, yanlış bir yanıt girerseniz PasswordRecovery denetimi bir hata iletisi görüntüler (bkz. Şekil 3). QuestionFailureText Bu hata iletisini özelleştirmek için özelliğini kullanın.

Kullanıcı Geçersiz Bir Güvenlik Yanıtı Girerse Hata İletisi Görüntülenir

Şekil 3: Kullanıcı Geçersiz Bir Güvenlik Yanıtı Girerse Bir Hata İletisi Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak, doğru güvenlik yanıtını girin ve Gönder'e tıklayın. Arka planda PasswordRecovery denetimi rastgele bir parola oluşturur, parolayı kullanıcı hesabına atar, kullanıcıya yeni parolasını bildiren bir e-posta gönderir (bkz. Şekil 4) ve ardından Başarı görünümünü görüntüler.

Kullanıcıya Yeni Parolası ile Bir E-posta Gönderilir

Şekil 4: Kullanıcıya Yeni Parolası ile Bir E-posta Gönderilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

E-postayı Özelleştirme

PasswordRecovery denetimi tarafından gönderilen varsayılan e-posta oldukça sıkıcıdır (bkz. Şekil 4). İleti, öğenin from özniteliğinde <smtp> belirtilen hesaptan konu Parolası ve düz metin gövdesiyle gönderilir:

Lütfen siteye dönün ve aşağıdaki bilgileri kullanarak oturum açın.

Kullanıcı Adı: kullanıcı adı

Parola: parola

Bu ileti, PasswordRecovery denetiminin SendingMailolayı için bir olay işleyicisi aracılığıyla veya özelliği aracılığıyla MailDefinition bildirimli olarak program aracılığıyla özelleştirilebilir. Şimdi bu seçeneklerin ikisini de inceleyelim.

Olay SendingMail , e-posta iletisi gönderilmeden hemen önce tetiklenir ve e-posta iletisini program aracılığıyla ayarlamak için son şansımızdır. Bu olay tetiklendiğinde, olay işleyicisine özelliği gönderilmek üzere olan Message e-postaya bir başvuru içeren türünde MailMessageEventArgsbir nesnesi geçirilir.

Olay için SendingMail bir olay işleyicisi oluşturun ve program aracılığıyla BILGI listesine ekleyen aşağıdaki kodu ekleyin webmaster@example.com .

protected void RecoverPwd_SendingMail(object sender, MailMessageEventArgs e)
{
    e.Message.CC.Add("webmaster@example.com");
}

E-posta iletisi bildirim temelli yollarla da yapılandırılabilir. PasswordRecovery'nin MailDefinition özelliği türünde MailDefinitionbir nesnedir. sınıfıMailDefinition, , , CC, Priority, SubjectIsBodyHtmlBodyFileNameve diğerleri gibi Frome-postayla ilgili özelliklerden oluşan bir konak sunar. Yeni başlayanlar için, Subject özelliğini varsayılan olarak kullanılandan daha açıklayıcı bir değere ayarlayın ( Parola ), örneğin Parolanız sıfırlandı...

E-posta iletisinin gövdesini özelleştirmek için, gövdenin içeriğini içeren ayrı bir e-posta şablonu dosyası oluşturmamız gerekir. web sitesinde adlı EmailTemplatesyeni bir klasör oluşturarak başlayın. Ardından, adlı PasswordRecovery.txt bu klasöre yeni bir metin dosyası ekleyin ve aşağıdaki içeriği ekleyin:

Your password has been reset, <%UserName%>!

According to our records, you have requested that your password be reset. Your new
password is: <%Password%>

If you have any questions or trouble logging on please contact a site administrator.

Thank you!

ve <%Password%>yer tutucularının <%UserName%> kullanımına dikkat edin. PasswordRecovery denetimi, bu iki yer tutucuyu e-posta göndermeden önce otomatik olarak kullanıcının kullanıcı adı ve kurtarılan parolasıyla değiştirir.

Son olarak, özelliğini BodyFileName yeni oluşturduğumuz (~/EmailTemplates/PasswordRecovery.txt) e-posta şablonuna işaret edin.MailDefinition

Bu değişiklikleri yaptıktan sonra sayfayı yeniden ziyaret edin RecoverPassword.aspx ve kullanıcı adınızı ve güvenlik yanıtınızı girin. Şekil 5'tekine benzer bir e-posta almanız gerekir. Cc'd olduğunu webmaster@example.com ve konu ve gövdenin güncelleştirildiğini unutmayın.

Konu, Gövde ve BILGI Listesi Güncelleştirildi

Şekil 5: Konu, Gövde ve BILGI Listesi Güncelleştirildi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

HTML biçimli bir e-postayı True olarak ayarlamak IsBodyHtml için (varsayılan değer False'tur) ve e-posta şablonunu HTML içerecek şekilde güncelleştirin.

MailDefinition özelliği PasswordRecovery sınıfı için benzersiz değildir. 2. Adımda göreceğimiz gibi ChangePassword denetimi de bir MailDefinition özellik sunar. Ayrıca CreateUserWizard denetimi, yeni kullanıcılara otomatik olarak hoş geldiniz e-posta iletisi gönderecek şekilde yapılandırabileceğiniz bir özellik içerir.

Not

Şu anda sol gezinti bölmesinde sayfaya ulaşmak RecoverPassword.aspx için bağlantı yok. Bir kullanıcı yalnızca sitede başarılı bir şekilde oturum açamadığında bu sayfayı ziyaret etmekle ilgilenir. Bu nedenle, sayfayı Login.aspx sayfanın bağlantısını içerecek şekilde güncelleştirin RecoverPassword.aspx .

Program Aracılığıyla Kullanıcının Parolasını Sıfırlama

Kullanıcının parolasını sıfırlarken PasswordRecovery denetimi nesnenin MembershipUser ResetPassword yöntemini çağırır. Bu yöntemin iki aşırı yüklemesi vardır:

  • ResetPassword - kullanıcının parolasını sıfırlar. False ise RequiresQuestionAndAnswer bu aşırı yüklemeyi kullanın.
  • ResetPassword(securityAnswer) - Yalnızca sağlanan securityAnswer doğruysa kullanıcının parolasını sıfırlar. True ise RequiresQuestionAndAnswer bu aşırı yüklemeyi kullanın.

Her iki aşırı yükleme de rastgele oluşturulan yeni parolayı döndürür.

Üyelik çerçevesindeki diğer yöntemlerde olduğu gibi, ResetPassword yöntem de yapılandırılan sağlayıcıya temsilci olarak verir. saklı SqlMembershipProvider yordamı çağırarak aspnet_Membership_ResetPassword kullanıcının kullanıcı adını, yeni parolayı ve sağlanan parola yanıtını diğer alanlar arasında geçirir. Saklı yordam, parola yanıtının eşleşmesini ve ardından kullanıcının parolasını güncelleştirmesini sağlar.

Birkaç alt düzey uygulama notu:

  • Kilitli bir kullanıcı parolasını sıfırlayamaz. Ancak onaylanmamış bir kullanıcı bunu yapabilir. Kilitlenen ve onaylanan durumları Kullanıcı Hesaplarının Kilidini Açma ve Onaylama öğreticisinde daha ayrıntılı olarak ele alacaktır.
  • Parola yanıtı yanlışsa, kullanıcının başarısız parola yanıtı deneme sayısı artırılır. Belirtilen süre içinde belirtilen sayıda geçersiz güvenlik yanıtı girişimi gerçekleşirse, kullanıcı kilitlenir.

Rastgele Parolaların Nasıl Oluşturulduğuna Dair Bir Sözcük

Şekil 4 ve 5'teki e-posta iletilerinde gösterilen rastgele oluşturulan parolalar Üyelik sınıfının GeneratePassword yöntemi tarafından oluşturulur. Bu yöntem iki tamsayı giriş parametresi kabul eder: length ve numberOfNonAlphanumericCharacters - ve en az sayıOfNonAlphanumericCharacters alfasayısal olmayan karakter sayısıyla uzun bir dize döndürür. Bu yöntem Üyelik sınıfları veya Oturum açma ile ilgili Web denetimleri içinden çağrıldığında, bu iki parametrenin değerleri sırasıyla 7 ve 1 olarak ayarladığımız Üyelik yapılandırması MinRequiredPasswordLength ve MinRequiredNonalphanumericCharacters özelliklerine göre belirlenir.

yöntemi, GeneratePassword hangi rastgele karakterlerin seçildiğine ilişkin bir sapma olmadığından emin olmak için kriptografik olarak güçlü bir rastgele sayı oluşturucu kullanır. Ayrıca , GeneratePassword publicrastgele dizeler veya parolalar oluşturmanız gerekiyorsa doğrudan ASP.NET uygulamanızdan kullanabileceğiniz anlamına gelir.

Not

SqlMembershipProvider sınıfı her zaman en az 14 karakter uzunluğunda rastgele bir parola oluşturur, bu nedenle 14'ten küçükse MinRequiredPasswordLength değeri yoksayılır.

2. Adım: Parolaları Değiştirme

Rastgele oluşturulan parolaları hatırlamak zordur. Şekil 4'te gösterilen parolayı göz önünde bulundurun: WWGUZv(f2yM:Bd. Bunu belleğe işlemeyi deneyin! Söylemeye gerek yok, bir kullanıcıya bu tür rastgele oluşturulmuş bir parola gönderildikten sonra parolayı daha akılda kalıcı bir parolayla değiştirmek isteyecektir.

Kullanıcının parolasını değiştirmesi için bir arabirim oluşturmak için ChangePassword denetimini kullanın. PasswordRecovery denetimine çok benzer şekilde ChangePassword denetimi de iki görünümden oluşur: Parolayı Değiştir ve Başarılı. Parolayı Değiştir görünümü, kullanıcıdan eski ve yeni parolalarını ister. Doğru eski parolayı ve en düşük uzunluk ile alfasayısal olmayan karakter gereksinimlerini karşılayan yeni bir parola sağlandıysa, ChangePassword denetimi kullanıcının parolasını güncelleştirir ve Başarı görünümünü görüntüler.

Not

ChangePassword denetimi, nesneninChangePassword yöntemini çağırarak MembershipUser kullanıcının parolasını değiştirir. ChangePassword yöntemi iki string giriş parametresi kabul eder: oldPassword ve newPassword- ve sağlanan oldPassword'un doğru olduğu varsayılarak kullanıcının hesabını newPassword ile güncelleştirir.

Sayfayı açın ve sayfaya ChangePassword.aspx bir ChangePassword denetimi ekleyerek adını verin ChangePwd. Bu noktada Tasarım görünümünde ParolaYı Değiştir görünümü gösterilmelidir (bkz. Şekil 6). PasswordRecovery denetiminde olduğu gibi, denetimin Akıllı Etiketi aracılığıyla görünümler arasında geçiş yapabilirsiniz. Ayrıca, bu görünümlerin görünümleri çeşitli stil özellikleri aracılığıyla veya bir şablona dönüştürülerek özelleştirilebilir.

Sayfaya ChangePassword Denetimi Ekleme

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

ChangePassword denetimi, oturum açmış durumdaki kullanıcının parolasını veya belirtilen başka bir kullanıcının parolasını güncelleştirebilir. Şekil 6'da gösterildiği gibi, varsayılan ParolaYı Değiştir görünümü yalnızca üç TextBox denetimini işler: biri eski parola için, ikisi de yeni parola için. Bu varsayılan arabirim, oturum açmış durumdaki kullanıcının parolasını güncelleştirmek için kullanılır.

Başka bir kullanıcının parolasını güncelleştirmek için ChangePassword denetimini kullanmak için denetimin DisplayUserName özelliğini True olarak ayarlayın. Bunu yaptığınızda, sayfaya dördüncü bir TextBox eklenir ve parolasının değiştireceği kullanıcının kullanıcı adı istenir.

Oturum açmış bir kullanıcının oturum açmak zorunda kalmadan parolasını değiştirmesine izin vermek istiyorsanız True olarak ayarlamak DisplayUserName yararlı olur. Kişisel olarak, bir kullanıcının parolasını değiştirmesine izin vermeden önce oturum açmasını gerektirmenin yanlış bir yanı olmadığını düşünüyorum. Bu nedenle, false (varsayılan) olarak bırakın DisplayUserName . Ancak bu kararı verirken, temelde anonim kullanıcıların bu sayfaya ulaşmasını engelledik. Anonim kullanıcıların ziyaret ChangePassword.aspxetmelerini engellemek için sitenin URL yetkilendirme kurallarını güncelleştirin. URL yetkilendirme kuralı söz diziminde belleğinizi yenilemeniz gerekiyorsa, Kullanıcı Tabanlı Yetkilendirme öğreticisine geri bakın.

Not

Özelliği, yöneticilerin DisplayUserName diğer kullanıcıların parolalarını değiştirmesine izin vermek için yararlı görünebilir. Ancak Doğru olarak ayarlandığında bile DisplayUserName doğru eski parolanın bilinmesi ve girilmesi gerekir. 3. Adımda yöneticilerin kullanıcıların parolalarını değiştirmesine izin verme tekniklerinden bahsedeceğiz.

Tarayıcı üzerinden sayfayı ChangePassword.aspx ziyaret edin ve parolanızı değiştirin. Üyelik yapılandırmasında belirtilen parola uzunluğunu ve alfasayısal olmayan karakter gereksinimlerini karşılayamayan yeni bir parola girerseniz bir hata iletisi görüntülendiğini unutmayın (bkz. Şekil 7).

Parola uzunluğunu ve alfasayısal olmayan karakter gereksinimlerini karşılayamayan yeni bir parola girerseniz bir hata iletisi görüntülenir.

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

Doğru eski parola ve geçerli bir yeni parola girildiğinde, oturum açan kullanıcının parolası değiştirilir ve Başarılı görünümü görüntülenir.

Onay E-postası Gönderme

Varsayılan olarak, ChangePassword denetimi parolası yeni güncelleştirilmiş olan kullanıcıya bir e-posta iletisi göndermez. E-posta göndermek isterseniz denetimin özelliğini yapılandırmanız yeterlidir MailDefinition . Kullanıcıya yeni parolasını içeren HTML biçimli bir e-posta gönderilmesi için ChangePassword denetimini yapılandıralım.

adlı ChangePassword.htmklasörde yeni bir dosya EmailTemplates oluşturarak başlayın. Aşağıdaki işaretlemeyi ekleyin:

<html>
 <body>
 <h2>Your Password Has Been Changed!</h2>
 <p>
 This email confirms that your password has been changed.
 </p>
 <p>
 To log on to the site, use the following credentials:
 </p>
 <table>
 <tr>
 <td>
 <b>Username:</b>
 </td>
 <td>
 <%UserName%>
 </td>
 </tr>
 <tr>
 <td>
 <b>Password:</b>
 </td>
 <td>
 <%Password%>
 </td>
 </tr>
 </table>
 <p>
 If you have any questions or encounter any problems logging in,
 please contact a site administrator.
 </p>
 </body>
</html>

Ardından, ChangePassword denetiminin MailDefinition özelliğinin BodyFileName, IsBodyHtmlve Subject özelliklerini sırasıyla ~/EmailTemplates/ChangePassword.htm, True ve Parolanız değişti! olarak ayarlayın.

Bu değişiklikleri yaptıktan sonra sayfayı yeniden ziyaret edin ve parolanızı yeniden değiştirin. Bu kez ChangePassword denetimi, kullanıcının dosyadaki e-posta adresine özelleştirilmiş, HTML biçimli bir e-posta gönderir (bkz. Şekil 8).

Kullanıcıya Parolasının Değiştiğini Bildiren Bir E-posta İletisi

Şekil 8: Kullanıcıya Parolasının Değiştiğini Bildiren Bir E-posta İletisi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

3. Adım: Yöneticilerin Kullanıcıların Parolalarını Değiştirmesine İzin Verme

Kullanıcı hesaplarını destekleyen uygulamalarda yaygın olarak kullanılan bir özellik, yönetici kullanıcının diğer kullanıcıların parolalarını değiştirebilmesidir. Bazen bu işlev gereklidir çünkü sistem kullanıcıların kendi parolalarını değiştirme yeteneğine sahip değildir. Böyle bir durumda, bir kullanıcının unutulan parolasını kurtarmasının tek yolu yöneticinin yeni bir parola ataması olabilir. Ancak PasswordRecovery ve ChangePassword denetimleriyle, kullanıcılar bunu kendileri yapabilecekleri için yönetici kullanıcıların parolalarını değiştirmekle meşgul olmaları gerekmez.

Peki ya istemciniz yönetici kullanıcıların diğer kullanıcıların parolalarını değiştirebilmeleri konusunda ısrar ederse ne olur? Ne yazık ki, bu işlevselliği eklemek biraz iş olabilir. Kullanıcının parolasını değiştirmek için nesnenin ChangePassword yöntemine MembershipUser hem eski hem de yeni parola sağlanmalıdır, ancak yöneticinin kullanıcının parolasını değiştirmesi için bilmesi gerekmez.

Geçici çözümlerden biri, önce kullanıcının parolasını sıfırlamak ve ardından aşağıdaki gibi bir kod kullanarak parolayı yeni parolayla değiştirmektir:

MembershipUser usr = Membership.GetUser(username);
string resetPwd = usr.ResetPassword();
usr.ChangePassword(resetPwd, newPassword);

Bu kod, yöneticinin parolasını değiştirmek istediği kullanıcı olan kullanıcı adı hakkındaki bilgileri alarak başlar. Ardından yöntemi ResetPassword çağrılır ve kullanıcıya yeni, rastgele bir parola atanır. Rastgele oluşturulan bu parola yöntemi tarafından döndürülür ve değişkeninde resetPwddepolanır. Artık kullanıcının parolasını bildiğimize göre, çağrısıyla ChangePassworddeğiştirebiliriz.

Sorun, bu kodun yalnızca Üyelik sistemi yapılandırması False olarak RequiresQuestionAndAnswer ayarlanmışsa çalışmasıdır. RequiresQuestionAndAnswer Uygulamamızda olduğu gibi True ise yöntemin ResetPassword güvenlik yanıtına geçirilmesi gerekir, aksi takdirde bir özel durum oluşturur.

Üyelik çerçevesi bir güvenlik sorusu ve yanıtı gerektirecek şekilde yapılandırılmışsa ve istemciniz yöneticilerin kullanıcıların parolalarını değiştirebildiğinden ısrar ederse üç seçeneğiniz vardır:

  • Ellerini havaya at ve müşterine bunun yapılamaz bir şey olduğunu söyle.
  • False olarak ayarlayın RequiresQuestionAndAnswer . Bu, daha az güvenli bir uygulamaya neden olur. Kötü bir kullanıcının başka bir kullanıcının e-posta gelen kutusuna erişim kazandığını düşünün. Belki de güvenliği aşılmış kullanıcı öğle yemeğine gitmek için masasını terk etti ve iş istasyonunu kilitlemedi veya genel bir terminalden e-postasına erişip oturumu kapatmadı. Her iki durumda da, kötü amaçlı kullanıcı sayfayı RecoverPassword.aspx ziyaret edebilir ve kullanıcının kullanıcı adını girebilir. Ardından sistem, güvenlik yanıtı istemeden kurtarılan parolayı e-postayla gönderir.
  • Üyelik çerçevesi tarafından oluşturulan soyutlama katmanını atlayıp doğrudan SQL Server veritabanıyla çalışın. Üyelik şeması, kullanıcının parolasını ayarlayan ve görevini gerçekleştirmek için güvenlik yanıtı veya eski parola gerektirmeyen adlı aspnet_Membership_SetPassword bir saklı yordam içerir.

Bu seçeneklerin hiçbiri özellikle cazip değil, ancak bir geliştiricinin hayatı bazen böyle devam ediyor.

Ve sınıflarını Membership MembershipUser atlayan ve doğrudan veritabanına karşı SecurityTutorials çalışan kod yazarak üçüncü yaklaşımı uyguladım.

Not

Doğrudan veritabanıyla birlikte çalışarak Üyelik çerçevesi tarafından sağlanan kapsülleme parçalanır. Bu karar bizi SqlMembershipProviderile bağlar ve kodumuzu daha az taşınabilir hale getirir. Ayrıca, Üyelik şeması değişirse bu kod ASP.NET'ın gelecekteki sürümlerinde beklendiği gibi çalışmayabilir. Bu yaklaşım geçici bir çözümdür ve çoğu geçici çözüm gibi en iyi yöntemlere örnek değildir.

Kodun bazı çekici olmayan bitleri vardır ve oldukça uzundur. Bu nedenle, bu öğreticiyi ayrıntılı bir incelemeyle karmaşık hale getirmek istemiyorum. Daha fazla bilgi edinmek istiyorsanız bu öğreticinin kodunu indirin ve sayfayı ziyaret edin ~/Administration/ManageUsers.aspx . Önceki öğreticide oluşturduğumuz bu sayfada her kullanıcı listelenir. GridView'ı, seçilen kullanıcının kullanıcı adını sorgu dizesi aracılığıyla geçirerek sayfaya UserInformation.aspx bir bağlantı içerecek şekilde güncelleştirdim. Sayfada UserInformation.aspx , seçilen kullanıcı hakkındaki bilgiler ve parolalarını değiştirmek için TextBoxes görüntülenir (bkz. Şekil 9).

Yeni parolayı girdikten, ikinci TextBox'a onayladıktan ve Kullanıcıyı Güncelleştir Düğmesi'ne tıkladıktan sonra, kullanıcının parolasını güncelleştirerek bir geri gönderme başlatılır ve aspnet_Membership_SetPassword saklı yordam çağrılır. Bu işlevle ilgilenen okuyucuları kod hakkında daha fazla bilgi edinmeye teşvik ediyorum ve işlevselliği, parolası değiştirilmiş olan kullanıcıya e-posta göndermeyi içerecek şekilde genişletmeyi deniyorum.

Yönetici Kullanıcının Parolasını Değiştirebilir

Şekil 9: Yönetici Kullanıcının Parolasını Değiştirebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Sayfa UserInformation.aspx şu anda yalnızca Üyelik çerçevesi parolaları Temizle veya Karma biçiminde depolamak üzere yapılandırılmışsa çalışır. Yeni parolayı şifrelemek için kod eksik olsa da, bu işlevi eklemeye davet edilirsiniz. Gerekli kodu eklemenizi önerdiğim yöntem, .NET Framework'teki yöntemlerin kaynak kodunu incelemek için Reflector gibi bir kod çözme yöntemi kullanmaktır; sınıfın SqlMembershipProvider ChangePassword yöntemini inceleyerek işe başlayın. Bu, parola karması oluşturmak için kodu yazmak için kullandığım tekniktir.

Özet

ASP.NET, kullanıcıların parolalarını yönetmesine yardımcı olmak için iki denetim sunar. PasswordRecovery denetimi, parolalarını unutanlar için kullanışlıdır. Üyelik çerçevesinin yapılandırmasına bağlı olarak, kullanıcıya mevcut parolası veya rastgele oluşturulan yeni bir parola e-postayla gönderilir. ChangePassword denetimi, kullanıcının parolasını güncelleştirmesini sağlar.

Login ve CreateUserWizard denetimleri gibi PasswordRecovery ve ChangePassword denetimleri de bildirim temelli işaretleme veya kod satırı yazmak zorunda kalmadan zengin bir kullanıcı arabirimi oluşturur. Varsayılan kullanıcı arabirimi gereksinimlerinizi karşılamıyorsa, çeşitli stil özellikleri aracılığıyla özelleştirebilirsiniz. Alternatif olarak, denetimlerin arabirimleri daha da ince bir denetim derecesi için şablonlara dönüştürülebilir. Arka planda bu denetimler Üyelik API'sini kullanır ve nesnenin MembershipUser ResetPassword ve ChangePassword yöntemlerini çağırı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ışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. 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 Michael Emmings ve Suchi Banerjee'yi içerir. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır bırakın mitchell@4GuysFromRolla.com