Obnovení a změna hesel (VB)
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 EnablePasswordRetrieval
EnablePasswordReset
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í.
Obrázek 1: Vzhled RequiresQuestionAndAnswer
EnablePasswordRetrieval
a 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.config
ná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
.
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 .
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.
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 SendingMail
PasswordRecovery 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
, CC
Priority
, Subject
, IsBodyHtml
, , BodyFileName
a 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 MailDefinition
BodyFileName
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.
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, pokudRequiresQuestionAndAnswer
je false.ResetPassword(securityAnswer)
- Resetuje heslo uživatele pouze v případě, že zadaný securityAnswer je správný. Toto přetížení použijte, pokudRequiresQuestionAndAnswer
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 MembershipUser
ChangePassword
. 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.
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).
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
, IsBodyHtml
a 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).
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ívitRecoverPassword.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.
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í:
- Rychlé zprovoznění ovládacího prvku ChangePassword
- Rychlé zprovoznění ovládacího prvku PasswordRecovery
- Odesílání Email v ASP.NET
System.Net.Mail
Faq
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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro