Sdílet prostřednictvím


Obnovení a změna hesel (VB)

Scott Mitchell

Poznámka

Od napsání tohoto článku jsou zprostředkovatelé členství ASP.NET nahrazeni ASP.NET Identity. Důrazně doporučujeme aktualizovat aplikace tak, aby používaly platformu ASP.NET Identity Platform místo zprostředkovatelů členství, které byly uvedené v době psaní tohoto článku. ASP.NET Identity má oproti systému členství ASP.NET řadu výhod, mezi které patří:

  • Lepší výkon
  • Vylepšená rozšiřitelnost a testovatelnost
  • Podpora OAuth, OpenID Connect a dvojúrovňového ověřování
  • Podpora identit na základě deklarací identity
  • Lepší interoperabilita s ASP.Net Core

ASP.NET obsahuje dva webové ovládací prvky, které pomáhají s obnovením a změnou hesel. Ovládací prvek PasswordRecovery umožňuje návštěvníkovi obnovit ztracené heslo. Ovládací prvek ChangePassword umožňuje uživateli aktualizovat heslo. Stejně jako ostatní webové ovládací prvky související s přihlášením, které jsme viděli v této sérii kurzů, fungují ovládací prvky PasswordRecovery a ChangePassword s architekturou členství na pozadí a resetují nebo upravují hesla uživatelů.

Úvod

Mezi weby pro mou banku, utility společnost, telefonní společnost, e-mailové účty a přizpůsobené webové portály, já, stejně jako většina lidí, mám desítky různých hesel, které si pamatuji. S tolika přihlašovacími údaji, které si v těchto dnech zapamatují, není neobvyklé, že lidé zapomenou své heslo. Aby to bylo potřeba zohlednit, musí weby, které nabízejí uživatelské účty, obsahovat způsob, jak může uživatel obnovit heslo. Tento proces obvykle zahrnuje vygenerování nového náhodného hesla a jeho odeslání e-mailem na e-mailovou adresu uživatele v souboru. Po obdržení nového hesla se většina uživatelů vrátí na web a změní heslo z náhodně vygenerovaného hesla na zapamatovatelné.

ASP.NET obsahuje dva webové ovládací prvky, které pomáhají s obnovením a změnou hesel. Ovládací prvek PasswordRecovery umožňuje návštěvníkovi obnovit ztracené heslo. Ovládací prvek ChangePassword umožňuje uživateli aktualizovat heslo. Stejně jako ostatní webové ovládací prvky související s přihlášením, které jsme viděli v této sérii kurzů, fungují ovládací prvky PasswordRecovery a ChangePassword s architekturou členství na pozadí a resetují nebo upravují hesla uživatelů.

V tomto kurzu prozkoumáme použití těchto dvou ovládacích prvků. Uvidíme také, jak prostřednictvím kódu programu změnit a resetovat heslo uživatele prostřednictvím MembershipUser tříd ChangePassword a ResetPassword metod.

Krok 1: Pomoc uživatelům s obnovením ztracených hesel

Všechny weby, které podporují uživatelské účty, musí uživatelům poskytnout určitý mechanismus pro obnovení zapomenutých hesel. Dobrou zprávou je, že implementace takové funkce v ASP.NET je hračka díky webovému ovládacímu prvku PasswordRecovery. Ovládací prvek PasswordRecovery vykreslí rozhraní, které uživatele vyzve k zadání uživatelského jména a v případě potřeby i odpověď na bezpečnostní otázku. Pak uživateli pošle e-mail s heslem.

Poznámka

Vzhledem k tomu, že se e-mailové zprávy přenášejí po drátě ve formátu prostého textu, existují bezpečnostní rizika spojená s odesíláním hesla uživatele e-mailem.

Ovládací prvek PasswordRecovery se skládá ze tří zobrazení:

  • UserName – vyzve návštěvníka k zadání uživatelského jména. Toto je počáteční zobrazení.
  • Otázka – zobrazí uživatelské jméno uživatele a bezpečnostní otázku jako text spolu s textovým polem, aby uživatel zadal odpověď na bezpečnostní otázku.
  • Úspěch – zobrazí zprávu informující uživatele, že mu bylo heslo e-mailem zadáno.

Zobrazení a akce prováděné ovládacím prvku PasswordRecovery závisí na následujících nastaveních konfigurace členství:

  • RequiresQuestionAndAnswer
  • EnablePasswordRetrieval
  • EnablePasswordReset

Nastavení rozhraní RequiresQuestionAndAnswer členství označuje, jestli uživatelé musí při registraci účtu zadat bezpečnostní otázku a odpověď. Jak jsme probrali v kurzu Vytváření uživatelských účtů, pokud RequiresQuestionAndAnswer je hodnota True (výchozí), pak rozhraní CreateUserWizard obsahuje ovládací prvky TextBox pro bezpečnostní otázku a odpověď nového uživatele. Pokud RequiresQuestionAndAnswer je hodnota Nepravda, neshromažďují se žádné takové informace. Podobně platí, že pokud RequiresQuestionAndAnswer je hodnota True, zobrazí ovládací prvek PasswordRecovery zobrazení otázky po zadání uživatelského jména uživatelem. Heslo se obnoví pouze v případě, že uživatel zadá správnou odpověď zabezpečení. Pokud RequiresQuestionAndAnswer je ale hodnota False, přesune se ovládací prvek PasswordRecovery přímo ze zobrazení UserName do zobrazení Úspěch.

Jakmile uživatel zadá své uživatelské jméno nebo uživatelské jméno a odpověď zabezpečení, pokud RequiresQuestionAndAnswer je hodnota True, hesloRecovery pošle uživateli e-mail s jeho heslem. EnablePasswordRetrieval Pokud je možnost nastavená na Hodnotu True, uživateli se pošle e-mail se svým aktuálním heslem. Pokud je nastavená hodnota False a EnablePasswordReset je nastavená na Hodnotu True, pak ovládací prvek PasswordRecovery vygeneruje nové náhodné heslo pro uživatele a toto nové heslo mu pošle e-mailem. Pokud jsou i EnablePasswordRetrievalEnablePasswordReset false, vyvolá ovládací prvek PasswordRecovery výjimku.

Poznámka

Vzpomeňte si, že SqlMembershipProvider hesla uživatelů se ukládají v jednom ze tří formátů: Vymazat, Hashovat (výchozí) nebo Šifrované. Použitý mechanismus úložiště závisí na nastavení konfigurace členství. ukázková aplikace používá formát hashovaného hesla. Při použití formátu EnablePasswordRetrieval hashovaného hesla musí být možnost nastavena na Hodnotu False, protože systém nemůže určit skutečné heslo uživatele z verze hash uložené v databázi.

Obrázek 1 znázorňuje, jak je rozhraní a chování PasswordRecovery ovlivněno konfigurací členství.

RequiresQuestionAndAnswer, EnablePasswordRetrieval a EnablePasswordReset ovlivňují vzhled a chování ovládacího prvku PasswordRecovery.

Obrázek 1: Vzhled RequiresQuestionAndAnswerEnablePasswordRetrievala EnablePasswordReset chování ovládacího prvku PasswordRecovery ( Kliknutím zobrazíte obrázek v plné velikosti)

Poznámka

V kurzu Vytvoření schématu členství v SQL Server jsme nakonfigurovali zprostředkovatele členství nastavením RequiresQuestionAndAnswer na Hodnotu True, EnablePasswordRetrieval False a EnablePasswordReset True.

Použití ovládacího prvku PasswordRecovery

Podívejme se na použití ovládacího prvku PasswordRecovery na stránce ASP.NET. Otevřete RecoverPassword.aspx a přetáhněte ovládací prvek PasswordRecovery ze sady nástrojů do Designer; nastavte jeho ID hodnotu na RecoverPwd. Stejně jako webové ovládací prvky Login a CreateUserWizard zobrazení ovládacího prvku PasswordRecovery vykreslují bohaté složené rozhraní, které zahrnuje popisky, textová pole, tlačítka a ověřovací ovládací prvky. Vzhled zobrazení můžete přizpůsobit pomocí vlastností stylu ovládacího prvku nebo převodem zobrazení na šablony. Nechám to jako cvičení pro čtenáře, který má zájem.

Když uživatel navštíví tuto stránku, zadá své uživatelské jméno a klikne na tlačítko Odeslat. Vzhledem k tomu, že jsme vlastnost v nastavení konfigurace členství nastavili RequiresQuestionAndAnswer na Hodnotu True, zobrazí ovládací prvek PasswordRecovery zobrazení otázky. Jakmile uživatel zadá správnou bezpečnostní odpověď a klikne na Odeslat, ovládací prvek PasswordRecovery aktualizuje heslo uživatele na náhodně vygenerované heslo a odešle ho e-mailem na e-mailovou adresu v souboru. To vše bylo možné bez toho, abychom museli psát jediný řádek kódu!

Než tuto stránku otestujete, je potřeba zadat nastavení doručování pošty v Web.confignástroji . Ovládací prvek PasswordRecovery se při odesílání e-mailu spoléhá na tato nastavení.

Konfigurace doručování pošty je určena prostřednictvím elementu <system.net> elementu<mailSettings>. Pomocí elementu<smtp> označte metodu doručení a výchozí adresu odesílatele. Následující kód nakonfiguruje nastavení pošty tak, aby používal síťový server SMTP s názvem smtp.example.com na portu 25 a s přihlašovacími údaji uživatelského jména a hesla.

Poznámka

<system.net> je podřízený prvek kořenového <configuration> elementu a na stejné hodnotě <system.web>. Proto neumisťujte <system.net> prvek do elementu <system.web> ; místo toho ho umístěte na stejnou úroveň.

<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>

Kromě použití serveru SMTP v síti můžete také zadat adresář pro vyzvednutí, do kterého se mají ukládat e-mailové zprávy, které se mají odeslat.

Jakmile nakonfigurujete nastavení SMTP, přejděte na RecoverPassword.aspx stránku přes prohlížeč. Nejprve zkuste zadat uživatelské jméno, které v uživatelském úložišti neexistuje. Jak ukazuje obrázek 2, ovládací prvek PasswordRecovery zobrazí zprávu oznamující, že k informacím o uživateli nelze získat přístup. Text zprávy lze přizpůsobit pomocí vlastnosti ovládacího prvkuUserNameFailureText.

Pokud je zadáno neplatné uživatelské jméno, zobrazí se chybová zpráva.

Obrázek 2: Při zadání neplatného uživatelského jména se zobrazí chybová zpráva (kliknutím zobrazíte obrázek v plné velikosti).

Teď zadejte uživatelské jméno. Použijte uživatelské jméno účtu v systému s e-mailovou adresou, ke které máte přístup a jejíž bezpečnostní odpověď znáte. Po zadání uživatelského jména a kliknutí na Odeslat ovládací prvek PasswordRecovery zobrazí zobrazení Otázky. Pokud zadáte nesprávnou odpověď, ovládací prvek PasswordRecovery zobrazí chybovou zprávu (viz obrázek 3) stejně jako v zobrazení UserName. QuestionFailureText K přizpůsobení této chybové zprávy použijte vlastnost .

Pokud uživatel zadá neplatnou odpověď zabezpečení, zobrazí se chybová zpráva.

Obrázek 3: Chybová zpráva se zobrazí, pokud uživatel zadá neplatnou odpověď zabezpečení (kliknutím zobrazíte obrázek v plné velikosti).

Nakonec zadejte správnou odpověď zabezpečení a klikněte na Odeslat. Ovládací prvek PasswordRecovery na pozadí vygeneruje náhodné heslo, přiřadí ho k uživatelskému účtu, odešle e-mail informující uživatele o novém hesle (viz Obrázek 4) a pak zobrazí zobrazení Úspěch.

Uživateli se odešle Email se svým novým heslem.

Obrázek 4: Uživateli se odešle Email se svým novým heslem (kliknutím zobrazíte obrázek v plné velikosti)

Přizpůsobení Email

Výchozí e-mail odeslaný ovládacím prvku PasswordRecovery je poněkud nudný (viz obrázek 4). Zpráva se odešle z účtu zadaného v atributu elementu <smtp>from s předmětem Heslo a text ve formátu prostého textu:

Vraťte se na web a přihlaste se pomocí následujících informací.

Uživatelské jméno: uživatelské jméno

Heslo: heslo

Tuto zprávu lze přizpůsobit programově prostřednictvím obslužné rutiny události pro událost ovládacího prvku SendingMailPasswordRecovery nebo deklarativně prostřednictvím MailDefinition vlastnosti. Pojďme se podívat na obě tyto možnosti.

Událost se SendingMail aktivuje těsně před odesláním e-mailové zprávy a je naší poslední možností, jak e-mailovou zprávu programově upravit. Při vyvolání této události je obslužné rutině události předán objekt typu MailMessageEventArgs, jehož Message vlastnost obsahuje odkaz na e-mail, který má být odeslán.

Vytvořte obslužnou rutinu SendingMail události pro událost a přidejte následující kód, který programově přidá webmaster@example.com do seznamu kopie.

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)Handles RecoverPwd.SendingMail
 e.Message.CC.Add("webmaster@example.com")
End Sub

E-mailovou zprávu je také možné nakonfigurovat deklarativními prostředky. Vlastnost PasswordRecovery MailDefinition je objekt typu MailDefinition. Třída MailDefinition nabízí řadu vlastností souvisejících s e-mailem, včetně From, CCPriority, Subject, IsBodyHtml, , BodyFileNamea dalších. Pro začátek nastavte Subject vlastnost na něco popisnějšího, než je hodnota použitá ve výchozím nastavení (Heslo), například Vaše heslo bylo resetováno...

K přizpůsobení textu e-mailové zprávy potřebujeme vytvořit samostatný soubor šablony e-mailu, který bude obsahovat obsah textu. Začněte vytvořením nové složky na webu s názvem EmailTemplates. Dále do této složky přidejte nový textový soubor s názvem PasswordRecovery.txt a přidejte následující obsah:

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!

Všimněte si použití zástupných symbolů <%UserName%> a <%Password%>. Ovládací prvek PasswordRecovery automaticky nahradí tyto dva zástupné symboly uživatelským jménem a obnoveným heslem před odesláním e-mailu.

Nakonec nasměrujte MailDefinitionBodyFileName vlastnost na šablonu e-mailu, kterou jsme právě vytvořili (~/EmailTemplates/PasswordRecovery.txt).

Po provedení těchto změn znovu přejděte na RecoverPassword.aspx stránku a zadejte své uživatelské jméno a odpověď zabezpečení. Dostanete e-mail, který vypadá podobně jako na obrázku 5. Všimněte si, že webmaster@example.com došlo k dokončení kopie a že předmět a text byly aktualizovány.

Předmět, text a seznam kopie byly aktualizovány.

Obrázek 5: Byl aktualizován seznam předmětu, textu a kopie (kliknutím zobrazíte obrázek v plné velikosti)

Pokud chcete odeslat e-mail ve formátu HTML nastavený IsBodyHtml na hodnotu Pravda (výchozí hodnota je False) a aktualizovat šablonu e-mailu tak, aby obsahovala HTML.

Vlastnost MailDefinition není jedinečná pro Třídu PasswordRecovery. Jak uvidíme v kroku 2, ovládací prvek ChangePassword také nabízí MailDefinition vlastnost. Kromě toho ovládací prvek CreateUserWizard obsahuje takovou vlastnost, kterou můžete nakonfigurovat tak, aby automaticky posílala uvítací e-mailovou zprávu novým uživatelům.

Poznámka

V levém navigačním panelu momentálně nejsou žádné odkazy pro přechod na RecoverPassword.aspx stránku. Uživatel by měl zájem o návštěvu této stránky pouze v případě, že se nemohl k webu úspěšně přihlásit. Proto aktualizujte Login.aspx stránku tak, aby obsahovala odkaz na RecoverPassword.aspx stránku.

Resetování hesla uživatele prostřednictvím kódu programu

Při resetování hesla uživatele volá ovládací prvek PasswordRecovery metodu MembershipUser objektuResetPassword. Tato metoda má dvě přetížení:

  • ResetPassword – Resetuje heslo uživatele. Toto přetížení použijte, pokud RequiresQuestionAndAnswer je false.
  • ResetPassword(securityAnswer) - Resetuje heslo uživatele pouze v případě, že zadaný securityAnswer je správný. Toto přetížení použijte, pokud RequiresQuestionAndAnswer má hodnotu True.

Obě přetížení vrátí nové, náhodně vygenerované heslo.

Stejně jako u ostatních metod v rámci členství i ResetPassword metoda deleguje nakonfigurovaného zprostředkovatele. Vyvolá SqlMembershipProvider uloženou proceduru aspnet_Membership_ResetPassword a mimo jiné předá uživatelské jméno uživatele, nové heslo a zadanou odpověď na heslo. Uložená procedura zajistí, aby odpověď na heslo odpovídala, a pak aktualizuje heslo uživatele.

Několik poznámek k implementaci na nízké úrovni:

  • Uzamčený uživatel nemůže resetovat heslo. Neschválené uživatele však může. O uzamčených a schválených stavech se podrobněji podíváme v kurzu Odemykání a schvalování uživatelských účtů.
  • Pokud je odpověď na heslo nesprávná, zvýší se počet neúspěšných pokusů o odpověď na heslo uživatele. Pokud během zadaného časového intervalu dojde k určitému počtu neplatných pokusů o odpověď na zabezpečení, uživatel je uzamčen.

Word o tom, jak se generují náhodná hesla

Náhodně vygenerovaná hesla zobrazená v e-mailových zprávách na obrázcích 4 a 5 jsou vytvořená metodou třídyGeneratePassword Členství. Tato metoda přijímá dva celočíselné vstupní paramtery – length a numberOfNonAlphanumericCharacters – a vrátí řetězec s minimální délkou znaků s alespoň numberOfNonAlphanumericCharacters počtem nealfamerických znaků. Když je tato metoda volána z webových ovládacích prvků souvisejících s členstvím nebo login, hodnoty pro tyto dva parametry jsou určeny vlastnostmi konfigurace MinRequiredPasswordLength členství a MinRequiredNonalphanumericCharacters vlastnostmi, které jsme nastavili na 7 a 1.

Metoda GeneratePassword používá kryptograficky silný generátor náhodných čísel k zajištění, že neexistují žádné předsudky v tom, jaké náhodné znaky jsou vybrány. Navíc je Public, což znamená, GeneratePassword že ho můžete použít přímo z aplikace ASP.NET, pokud potřebujete vygenerovat náhodné řetězce nebo hesla.

Poznámka

Třída SqlMembershipProvider vždy vygeneruje náhodné heslo o délce alespoň 14 znaků, takže pokud MinRequiredPasswordLength je menší než 14, jeho hodnota se ignoruje.

Krok 2: Změna hesel

Náhodně vygenerovaná hesla jsou obtížně zapamatovatelná. Podívejte se na heslo zobrazené na obrázku 4: WWGUZv(f2yM:Bd. Zkuste to ověřit v paměti! Netřeba říkat, že poté, co se uživateli pošle náhodně vygenerované heslo tohoto druhu, bude chtít změnit heslo na něco zapamatovatelnějšího.

Pomocí ovládacího prvku ChangePassword vytvořte rozhraní pro změnu hesla uživatele. Podobně jako ovládací prvek PasswordRecovery se ovládací prvek ChangePassword skládá ze dvou zobrazení: Změnit heslo a Úspěch. Zobrazení Změnit heslo vyzve uživatele k zadání starých a nových hesel. Po zadání správného starého hesla a nového hesla, které splňuje minimální délku a požadavky na jiné než alfanumerické znaky, ovládací prvek ChangePassword aktualizuje heslo uživatele a zobrazí zobrazení Úspěch.

Poznámka

Ovládací prvek ChangePassword upraví heslo uživatele vyvoláním metody objektu MembershipUserChangePassword. Metoda ChangePassword přijímá dva String vstupní parametry – oldPassword a newPassword – a aktualizuje uživatelský účet pomocí newPassword za předpokladu, že zadaný parametr oldPassword je správný.

ChangePassword.aspx Otevřete stránku a přidejte na stránku ovládací prvek ChangePassword s jeho pojmenováním ChangePwd. V tomto okamžiku by se v návrhovém zobrazení mělo zobrazit zobrazení Změnit heslo (viz obrázek 6). Podobně jako u ovládacího prvku PasswordRecovery můžete přepínat mezi zobrazeními prostřednictvím inteligentní značky ovládacího prvku. Vzhled těchto zobrazení je navíc možné přizpůsobit prostřednictvím vlastností různého stylu nebo jejich převodem na šablonu.

Přidání ovládacího prvku ChangePassword na stránku

Obrázek 6: Přidání ovládacího prvku ChangePassword na stránku (kliknutím zobrazíte obrázek v plné velikosti)

Ovládací prvek ChangePassword může aktualizovat aktuálně přihlášené heslo uživatele nebo heslo jiného zadaného uživatele. Jak ukazuje obrázek 6, výchozí zobrazení Změnit heslo vykreslí jenom tři ovládací prvky TextBox: jeden pro staré heslo a dva pro nové heslo. Toto výchozí rozhraní slouží k aktualizaci aktuálně přihlášeného hesla uživatele.

Pokud chcete použít ovládací prvek ChangePassword k aktualizaci hesla jiného uživatele, nastavte vlastnost ovládacího prvku DisplayUserName na Hodnotu True. Tím se na stránku přidá čtvrté textové pole s výzvou k zadání uživatelského jména uživatele, jehož heslo se má změnit.

Nastavení DisplayUserName na Hodnotu True je užitečné, pokud chcete odhlášeným uživatelům umožnit, aby si změnil heslo, aniž by se musel přihlásit. Osobně si myslím, že není nic špatného na tom, aby se uživatel přihlásil před tím, než jí umožní změnit heslo. Proto ponechte DisplayUserName nastavenou hodnotu False (výchozí hodnota). Tímto rozhodnutím však v podstatě bráníme anonymním uživatelům přístup na tuto stránku. Aktualizujte pravidla autorizace adres URL webu tak, aby anonymní uživatelé mohli odepřít návštěvu ChangePassword.aspx. Pokud potřebujete aktualizovat paměť syntaxe autorizačního pravidla adresy URL, projděte si kurz Autorizace na základě uživatelů.

Poznámka

Může se zdát, že tato vlastnost je užitečná k tomu, DisplayUserName aby správci mohli měnit hesla jiných uživatelů. I když DisplayUserName je ale nastavená hodnota True, musí být správné staré heslo známé a zadané. V kroku 3 si povíme o technikách umožňujících správcům měnit hesla uživatelů.

Přejděte na ChangePassword.aspx stránku v prohlížeči a změňte si heslo. Všimněte si, že pokud zadáte nové heslo, které nesplňuje délku hesla a požadavky na jiné než alfanumerické znaky zadané v konfiguraci členství, zobrazí se chybová zpráva (viz Obrázek 7).

Pokud zadáte nové heslo, které nesplňuje délku hesla a požadavky na jiné než alfanumerické znaky, zobrazí se chybová zpráva.

Obrázek 7: Přidání ovládacího prvku ChangePassword na stránku (kliknutím zobrazíte obrázek v plné velikosti)

Po zadání správného starého hesla a platného nového hesla se heslo přihlášeného uživatele změní a zobrazí se zobrazení Úspěch.

Odeslání potvrzovacího Email

Ve výchozím nastavení ovládací prvek ChangePassword neodesílá e-mailovou zprávu uživateli, jehož heslo bylo právě aktualizováno. Pokud chcete poslat e-mail, jednoduše nakonfigurujte MailDefinition vlastnost ovládacího prvku. Pojďme nakonfigurovat ovládací prvek ChangePassword tak, aby uživateli byl odeslán e-mail ve formátu HTML, který obsahuje nové heslo.

Začněte vytvořením nového souboru ve EmailTemplates složce s názvem ChangePassword.htm. Přidejte následující značku:

<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>

Dále nastavte vlastnosti BodyFileName, IsBodyHtmla Subject ovládacího prvku MailDefinition ChangePassword na ~/EmailTemplates/ChangePassword.htm, True a Vaše heslo se změnilo!.

Po provedení těchto změn znovu přejděte na stránku a znovu změňte heslo. Tentokrát ovládací prvek ChangePassword odešle přizpůsobený e-mail ve formátu HTML na e-mailovou adresu uživatele v souboru (viz Obrázek 8).

Zpráva Email informuje uživatele o změně hesla

Obrázek 8: Zpráva Email informuje uživatele, že se změnilo heslo (kliknutím zobrazíte obrázek v plné velikosti).

Krok 3: Povolení správcům měnit hesla uživatelů

Běžnou funkcí aplikací, které podporují uživatelské účty, je možnost správce měnit hesla jiných uživatelů. Někdy se tato funkce vyžaduje, protože systém nemá možnost, aby si uživatelé mohli měnit vlastní hesla. V takovém případě by jediným způsobem, jak může uživatel obnovit zapomenuté heslo, bylo, že mu správce přiřadí nové heslo. U ovládacích prvků PasswordRecovery a ChangePassword se ale správci nemusí zabývat změnou hesel uživatelů, protože to zvládnou sami.

Ale co když váš klient trvá na tom, aby správci mohli měnit hesla jiných uživatelů? Přidání této funkce bohužel může být trochu práce. Pokud chcete změnit heslo uživatele, musí být metodě objektu ChangePassword zadáno MembershipUser staré i nové heslo, ale správce by neměl znát heslo uživatele, aby ho mohl upravit.

Jedním z alternativních řešení je nejprve resetovat heslo uživatele a pak ho změnit na nové heslo pomocí kódu podobného následujícímu:

Dim usr As MembershipUser = Membership.GetUser(username)
Dim resetPwd As String = usr.ResetPassword()
usr.ChangePassword(resetPwd, newPassword)

Tento kód začíná načtením informací o uživatelském jménu, což je uživatel, jehož heslo chce správce změnit. ResetPassword Dále se vyvolá metoda , která uživateli přiřadí nové náhodné heslo. Toto náhodně vygenerované heslo vrátí metoda a uloží se do proměnné resetPwd. Když teď známe heslo uživatele, můžeme ho změnit voláním .ChangePassword

Problém spočívá v tom, že tento kód funguje pouze v případě, že RequiresQuestionAndAnswer je konfigurace systému členství nastavena na hodnotu False. Pokud RequiresQuestionAndAnswer je hodnota True, stejně jako u naší aplikace, je ResetPassword potřeba metodě předat odpověď zabezpečení, jinak dojde k výjimce.

Pokud je architektura členství nakonfigurovaná tak, aby vyžadovala bezpečnostní otázku a odpověď, a přesto váš klient trvá na tom, aby správci mohli měnit hesla uživatelů, máte tři možnosti:

  • Hoďte rukama do vzduchu a řekněte klientovi, že je to jen jedna věc, kterou nelze udělat.
  • Nastavte RequiresQuestionAndAnswer na False. Výsledkem je méně bezpečná aplikace. Představte si, že zločinný uživatel získal přístup k e-mailové schránce jiného uživatele. Je možné, že ohrožený uživatel opustil svůj stůl, aby šel na oběd a nezamkl pracovní stanici, nebo možná přistupoval ke svému e-mailu z veřejného terminálu a neodhlasoval se. V obou případech může zločinný uživatel navštívit RecoverPassword.aspx stránku a zadat uživatelské jméno uživatele. Systém pak obnovené heslo pošle e-mailem bez výzvy k zadání bezpečnostní odpovědi.
  • Obejděte vrstvu abstrakce vytvořenou architekturou Membership a pracujte přímo s databází SQL Server. Schéma členství obsahuje uloženou proceduru s názvem aspnet_Membership_SetPassword , která nastavuje heslo uživatele a nevyžaduje bezpečnostní odpověď nebo staré heslo, aby mohl plnit svůj úkol.

Žádná z těchto možností není zvlášť přitažlivá, ale tak to někdy vývojáři dělají.

Pokračoval jsem a implementoval jsem třetí přístup– psaní kódu, který obchází Membership třídy a MembershipUser a pracuje přímo s SecurityTutorials databází.

Poznámka

Při přímé práci s databází se zapouzdření poskytované rozhraním Membership rozbije. Toto rozhodnutí nás spojuje s SqlMembershipProvider, takže náš kód je méně přenosný. Kromě toho tento kód nemusí fungovat podle očekávání v budoucích verzích ASP.NET, pokud se změní schéma členství. Tento přístup je alternativním řešením a stejně jako většina alternativních řešení není příkladem osvědčených postupů.

Kód má několik neatraktivních bitů a je poměrně dlouhý. Proto nechci zaplnění tohoto tutoriálu s hloubkovým prozkoumáním. Pokud se chcete dozvědět více, stáhněte si kód pro tento kurz a navštivte ~/Administration/ManageUsers.aspx tuto stránku. Tato stránka, kterou jsme vytvořili v předchozím kurzu, obsahuje seznam jednotlivých uživatelů. Aktualizoval(a) jsem Objekt GridView tak, aby zahrnoval odkaz na UserInformation.aspx stránku a předal uživatelské jméno vybraného uživatele přes řetězec dotazu. Stránka UserInformation.aspx zobrazí informace o vybraném uživateli a textových polích pro změnu hesla (viz Obrázek 9).

Po zadání nového hesla, potvrzení v druhém textovém poli a kliknutí na tlačítko Aktualizovat uživatele dojde k zpětnému odeslání a aspnet_Membership_SetPassword vyvolá se uložená procedura, která aktualizuje heslo uživatele. Doporučuji čtenářům, kteří se zajímají o tuto funkci, aby se blíže seznámili s kódem a pokusili se rozšířit funkčnost tak, aby zahrnovala odeslání e-mailu uživateli, jehož heslo bylo změněno.

Správce může změnit heslo uživatele

Obrázek 9: Správce může změnit heslo uživatele (kliknutím zobrazíte obrázek v plné velikosti)

Poznámka

Stránka UserInformation.aspx aktuálně funguje jenom v případě, že je architektura členství nakonfigurovaná tak, aby ukládal hesla ve formátu Clear nebo Hashed. Chybí kód pro šifrování nového hesla, i když jste vyzváni k přidání této funkce. Způsob, jak doporučuji přidat potřebný kód, je použít dekompiler, jako je Reflector , prozkoumat zdrojový kód pro metody v rozhraní .NET Framework; začněte prozkoumáním SqlMembershipProvider metody třídy ChangePassword . Toto je technika, kterou jsem použil k napsání kódu pro vytvoření hodnoty hash hesla.

Souhrn

ASP.NET nabízí dva ovládací prvky, které uživatelům pomůžou spravovat heslo. Ovládací prvek PasswordRecovery je užitečný pro ty, kteří zapomněli svá hesla. V závislosti na konfiguraci architektury členství se uživateli buď pošle e-mailem stávající heslo, nebo nové, náhodně vygenerované heslo. Ovládací prvek ChangePassword umožňuje uživateli aktualizovat heslo.

Stejně jako Login a CreateUserWizard ovládací prvky PasswordRecovery a ChangePassword vykreslují bohaté uživatelské rozhraní, aniž by bylo nutné psát lick deklarativní značky nebo řádek kódu. Pokud výchozí uživatelské rozhraní nevyhovuje vašim potřebám, můžete si ho přizpůsobit pomocí různých vlastností stylu. Alternativně lze rozhraní ovládacích prvků převést na šablony pro ještě jemnější úroveň kontroly. Tyto ovládací prvky na pozadí používají rozhraní API pro členství a vyvolávají MembershipUser objekty ResetPassword a ChangePassword metody.

Všechno nejlepší na programování!

Další čtení

Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:

O autorovi

Scott Mitchell, autor několika knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Scotta můžete zastihnout na adrese mitchell@4guysfromrolla.com nebo prostřednictvím svého blogu na adrese http://ScottOnWriting.NET.

Zvláštní poděkování

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Mezi hlavní revidující pro tento kurz patří Michael Emmings a Suchi Banerjee. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi čáru na mitchell@4GuysFromRolla.com