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.
Şekil 1: RequiresQuestionAndAnswer
, EnablePasswordRetrieval
ve 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)
Not
SQL Server'da Üyelik Şeması Oluşturma öğreticisinde, Üyelik sağlayıcısını True, EnablePasswordRetrieval
False ve EnablePasswordReset
True olarak ayarlayarak RequiresQuestionAndAnswer
yapılandırdık.
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
RecoverPwd
ayarlayı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.config
belirtmemiz 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.
Ş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.
Ş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.
Ş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 SendingMail
olayı 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 MailMessageEventArgs
bir 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 MailDefinition
bir nesnedir. sınıfıMailDefinition
, , , CC
, Priority
, Subject
IsBodyHtml
BodyFileName
ve diğerleri gibi From
e-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ı EmailTemplates
yeni 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.
Ş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 iseRequiresQuestionAndAnswer
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 iseRequiresQuestionAndAnswer
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
public
rastgele 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.
Ş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.aspx
etmelerini 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).
Ş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.htm
klasö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
, IsBodyHtml
ve 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).
Ş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 resetPwd
depolanır. Artık kullanıcının parolasını bildiğimize göre, çağrısıyla ChangePassword
değ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 SqlMembershipProvider
ile 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.
Ş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:
- ChangePassword Denetimi Hızlı Başlangıçları
- PasswordRecovery Denetimi Hızlı Başlangıçları
- ASP.NET'de E-posta Gönderme
System.Net.Mail
SSS
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