Obnovení a změna hesel (C#)
Scott Mitchell
Poznámka:
Od napsání tohoto článku jsou poskytovatelé členství ASP.NET nahrazeni ASP.NET Identitou. Důrazně doporučujeme aktualizovat aplikace tak, aby používaly platformu ASP.NET Identity , a ne na poskytovatele členství, kteří jsou v době psaní tohoto článku doporučeni. ASP.NET Identity má řadu výhod oproti systému členství ASP.NET, včetně:
- 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 pro pomoc 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. Podobně 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í k resetování nebo úpravě hesel uživatelů.
Úvod
Mezi weby pro moji banku, utility společnost, telefonní společnost, e-mailové účty a přizpůsobené webové portály, já, jako většina lidí, mají desítky různých hesel, které si pamatovat. S tolika přihlašovacími údaji, které si v těchto dnech zapamatujete, není neobvyklé, že lidé zapomněli své heslo. K tomuto účtu musí weby, které nabízejí uživatelské účty, zahrnovat způsob, jak uživatel obnovit heslo. Tento proces obvykle zahrnuje generování nového, náhodného hesla a jeho odeslání e-mailem na e-mailovou adresu uživatele v souboru. Po přijetí 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ější.
ASP.NET obsahuje dva webové ovládací prvky pro pomoc 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. Podobně 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í k resetování nebo úpravě hesel uživatelů.
V tomto kurzu prozkoumáme použití těchto dvou ovládacích prvků. Také se dozvíme, jak programově změnit a resetovat heslo uživatele prostřednictvím MembershipUser
ChangePassword
metod a ResetPassword
tříd.
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 těchto funkcí v ASP.NET je díky webovému ovládacímu prvku PasswordRecovery hračka. Ovládací prvek PasswordRecovery vykreslí rozhraní, které uživatele vyzve k zadání uživatelského jména a v případě potřeby odpověď na bezpečnostní otázku. Pak pošle uživateli e-mail s heslem.
Poznámka:
Vzhledem k tomu, že se e-mailové zprávy přenášejí přes drát ve formátu prostého textu, existují bezpečnostní rizika spojená s odesláním hesla uživatele e-mailem.
Ovládací prvek PasswordRecovery se skládá ze tří zobrazení:
- Uživatelské jméno – 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 TextBox, aby uživatel zadal odpověď na bezpečnostní otázku.
- Úspěch – zobrazí zprávu informující uživatele, že jeho heslo bylo e-mailem.
Zobrazení 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í architektury RequiresQuestionAndAnswer
členství označuje, jestli uživatelé musí při registraci účtu zadat bezpečnostní otázku a odpověď. Jak jsme si probrali v kurzu Vytváření uživatelských účtů, pokud RequiresQuestionAndAnswer
je 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 Nepravda, nejsou tyto informace shromažďovány. Podobně platí, že pokud RequiresQuestionAndAnswer
je true, zobrazí ovládací prvek PasswordRecovery zobrazení otázky po zadání uživatelského jména uživatele. Heslo se obnoví jenom v případě, že uživatel zadá správnou odpověď zabezpečení. Pokud RequiresQuestionAndAnswer
je však false, ovládací prvek PasswordRecovery se přesune přímo ze zobrazení UserName do zobrazení Úspěch.
Jakmile uživatel zadá své uživatelské jméno ( nebo uživatelské jméno a bezpečnostní odpověď, pokud RequiresQuestionAndAnswer
je true – HesloRecovery pošle uživateli své heslo. Pokud je tato EnablePasswordRetrieval
možnost nastavená na Hodnotu True, uživatel odešle e-mailem své aktuální heslo. Pokud je nastavena na Hodnotu False a EnablePasswordReset
je nastavena na Hodnotu True, pak ovládací prvek PasswordRecovery vygeneruje nové, náhodné heslo pro uživatele a odešle mu toto nové heslo. Pokud jsou obě EnablePasswordRetrieval
a EnablePasswordReset
jsou 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, Hashed (výchozí) nebo Encrypted. 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 vliv rozhraní a chování PasswordRecovery na konfiguraci členství.
Obrázek 1: Vzhled EnablePasswordRetrieval
RequiresQuestionAndAnswer
a chování ovládacího prvku PasswordRecovery a EnablePasswordReset
jeho vliv (kliknutím zobrazíte obrázek s plnou velikostí)
Poznámka:
V kurzu Vytvoření schématu členství v SQL Serveru jsme nakonfigurovali zprostředkovatele členství nastavením RequiresQuestionAndAnswer
true, EnablePasswordRetrieval
false a EnablePasswordReset
true.
Použití ovládacího prvku PasswordRecovery
Pojďme se podívat 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 Návrháře a nastavte jeho ID
hodnotu na RecoverPwd
. Podobně jako webové ovládací prvky Login a CreateUserWizard vykreslují zobrazení ovládacího prvku PasswordRecovery 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. Opouštím to jako cvičení pro zájemce čtenáře.
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 v nastavení konfigurace členství nastavili RequiresQuestionAndAnswer
vlastnost True, ovládací prvek PasswordRecovery pak zobrazí zobrazení Otázky. Jakmile uživatel zadá správnou odpověď na zabezpečení a klikne na Odeslat, ovládací prvek PasswordRecovery aktualizuje heslo uživatele na náhodně vygenerované heslo a odešle toto heslo e-mailem na e-mailovou adresu v souboru. To vše bylo možné, aniž bysme museli napsat jeden řádek kódu!
Než tuto stránku otestujete, je tu jedna konečná konfigurace, která má tendenci: musíme zadat nastavení doručování pošty v Web.config
souboru . Ovládací prvek PasswordRecovery spoléhá na tato nastavení pro odesílání e-mailů.
Konfigurace doručování pošty je určena prostřednictvím elementu <system.net>
elementu<mailSettings>
. Pomocí elementu <smtp>
uveďte metodu doručení a výchozí adresu From. Následující kód konfiguruje nastavení pošty tak, aby používal síťový server SMTP pojmenovaný smtp.example.com
na portu 25 a s přihlašovacími údaji uživatelského jména a hesla pro uživatelské jméno a heslo.
Poznámka:
<system.net>
je podřízený prvek kořenového <configuration>
prvku a na stejné straně <system.web>
. Proto nevkládejte <system.net>
prvek do elementu <system.web>
; místo toho jej 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 případně zadat adresář vyzvednutí, do kterého se mají odesílat e-mailové zprávy.
Jakmile nakonfigurujete nastavení SMTP, přejděte na RecoverPassword.aspx
stránku v prohlížeči. Nejdřív zkuste zadat uživatelské jméno, které v úložišti uživatelů neexistuje. Jak ukazuje obrázek 2, ovládací prvek PasswordRecovery zobrazí zprávu, že k informacím o uživateli nelze získat přístup. Text zprávy lze přizpůsobit pomocí vlastnosti ovládacího prvku.UserNameFailureText
Obrázek 2: Chybová zpráva se zobrazí, pokud je zadáno neplatné uživatelské jméno (kliknutím zobrazíte obrázek v plné velikosti).
Teď zadejte uživatelské jméno. Uživatelské jméno účtu v systému použijte 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 zobrazí ovládací prvek PasswordRecovery zobrazení otázky. Stejně jako v zobrazení UserName se zobrazí chybová zpráva (viz obrázek 3) a zadáte nesprávnou odpověď ovládacího prvku PasswordRecovery. Tuto chybovou QuestionFailureText
zprávu můžete přizpůsobit pomocí vlastnosti .
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 heslu (viz obrázek 4) a pak zobrazí zobrazení Úspěch.
Obrázek 4: Uživateli se odešle e-mail s novým heslem (kliknutím zobrazíte obrázek v plné velikosti).
Přizpůsobení e-mailu
Výchozí e-mail odeslaný ovládacím prvku PasswordRecovery je poměrně nudný (viz obrázek 4). Zpráva se odešle z účtu zadaného v atributu <smtp>
elementu from
s předmětem Heslo a text 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 prozkoumat obě tyto možnosti.
Událost SendingMail
se aktivuje hned před odesláním e-mailové zprávy a je naší poslední šancí na programovou úpravu e-mailové zprávy. Při vyvolání této události se obslužná rutina události předá objekt typu MailMessageEventArgs
, jehož Message
vlastnost obsahuje odkaz na e-mail, který se má odeslat.
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 void RecoverPwd_SendingMail(object sender, MailMessageEventArgs e)
{
e.Message.CC.Add("webmaster@example.com");
}
E-mailovou zprávu je možné nakonfigurovat také prostřednictvím deklarativních prostředků. 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žívaná ve výchozím nastavení ( Heslo), například Vaše heslo bylo resetováno...
Abychom přizpůsobili text e-mailové zprávy, musíme vytvořit samostatný soubor šablony e-mailu, který obsahuje 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 tyto dva zástupné symboly automaticky nahradí 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ěchtoch RecoverPassword.aspx
Dostanete e-mail, který vypadá podobně jako na obrázku 5. Všimněte si, že webmaster@example.com
cc'd a 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 True (výchozí hodnota je Nepravda) a aktualizujte šablonu e-mailu tak, aby obsahovala kód 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. Ovládací prvek CreateUserWizard navíc obsahuje takovou vlastnost, kterou můžete nakonfigurovat tak, aby automaticky odeslala uvítací e-mailovou zprávu novým uživatelům.
Poznámka:
V současné době nejsou v levém navigačním panelu žádné odkazy pro dosažení RecoverPassword.aspx
stránky. Uživatel by se zajímal pouze o návštěvu této stránky, pokud se nemohl úspěšně přihlásit k webu. 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, PasswordRecovery ovládací prvek volá 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 je zadaný securityAnswer správný. Toto přetížení použijte, pokudRequiresQuestionAndAnswer
je true.
Obě přetížení vrací nové náhodně generované heslo.
Stejně jako u ostatních metod v rámci členství metoda ResetPassword
deleguje na nakonfigurovaného zprostředkovatele. Vyvolá SqlMembershipProvider
uloženou proceduru aspnet_Membership_ResetPassword
, předání uživatelského jména uživatele, nové heslo a zadanou odpověď na heslo mimo jiné. Uložená procedura zajišťuje, aby odpověď na heslo odpovídala, a pak aktualizovala heslo uživatele.
Několik poznámek k implementaci nízké úrovně:
- Uzamčený uživatel nemůže resetovat heslo. Neschválené uživatele však může. Podrobněji probereme uzamčené a schválené stavy v kurzu Odemknutí 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 v zadaném časovém intervalu dojde k zadanému počtu neplatných pokusů o odpověď na zabezpečení, je uživatel uzamčen.
Slovo o tom, jak se generují náhodná hesla
Náhodně generovaná hesla zobrazená v e-mailových zprávách v obrázcích 4 a 5 jsou vytvořena metodou třídy členství.GeneratePassword
Tato metoda přijímá dva celočíselné vstupní paramtery – délku a čísloOfNonAlphanumericCharacters – a vrátí řetězec alespoň dlouhé znaky s alespoň číslemOfNonAlphanumericCharacters počet nealnumerických znaků. Pokud je tato metoda volána z tříd členství nebo login-související webové ovládací prvky, hodnoty pro tyto dva parametry jsou určeny konfigurací MinRequiredPasswordLength
členství a MinRequiredNonalphanumericCharacters
vlastnostmi, které jsme nastavili na hodnotu 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. Kromě toho to znamenápublic
, GeneratePassword
že ho můžete použít přímo z ASP.NET aplikace, pokud potřebujete vygenerovat náhodné řetězce nebo hesla.
Poznámka:
Třída SqlMembershipProvider
vždy generuje náhodné heslo nejméně 14 znaků dlouhé, takže pokud MinRequiredPasswordLength
je menší než 14, jeho hodnota bude ignorována.
Krok 2: Změna hesel
Náhodně generovaná hesla se obtížně pamatují. Představte si heslo zobrazené na obrázku 4: WWGUZv(f2yM:Bd
. Zkuste to ověřit v paměti. Nemusíme říct, že po odeslání náhodně generovaného hesla tohoto typu bude chtít heslo změnit na něco zapamatovatějšího.
Pomocí ovládacího prvku ChangePassword vytvořte rozhraní pro uživatele, který může změnit heslo. Podobně jako u ovládacího prvku PasswordRecovery se ovládací prvek ChangePassword skládá ze dvou zobrazení: Změnit heslo a úspěch. Zobrazení Změnit heslo uživatele vyzve 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 jiné než alfanumerické požadavky na znak, 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 MembershipUser
metody objektuChangePassword
. Metoda ChangePassword přijímá dva string
vstupní parametry – oldPassword a newPassword- a aktualizuje uživatelský účet pomocí newPassword, za předpokladu, že zadaný starýPassword je správný.
ChangePassword.aspx
Otevřete stránku a přidejte na stránku ovládací prvek ChangePassword a pojmete ho 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. Vzhledy těchto zobrazení se navíc dají přizpůsobit pomocí vlastností seřazené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 vykresluje 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.
Chcete-li použít ChangePassword k aktualizaci hesla jiného uživatele, nastavte vlastnost ovládacího prvku DisplayUserName
na True. Tím přidáte na stránku čtvrtý TextBox 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 nechat přihlášeného uživatele změnit heslo bez nutnosti přihlášení. Osobně si myslím, že není nic špatného s tím, že uživatel musí přihlásit, než jí umožní změnit heslo. Proto ponechte DisplayUserName
nastavenou hodnotu False (výchozí hodnota). Při rozhodování ale v podstatě bráníme anonymním uživatelům dostat se na tuto stránku. Aktualizujte autorizační pravidla adresy URL webu tak, aby odepřeli anonymním uživatelům, aby je navštívili ChangePassword.aspx
. Pokud potřebujete aktualizovat paměť v syntaxi autorizačního pravidla adresy URL, projděte si kurz autorizace na základě uživatele.
Poznámka:
Může se zdát, že DisplayUserName
tato vlastnost je užitečná pro povolení změn hesel jiných uživatelů správci. I když DisplayUserName
je však nastavena hodnota True, musí být známé a zadané správné staré heslo. Promluvíme si o technikách, jak správcům umožnit měnit hesla uživatelů v kroku 3.
ChangePassword.aspx
Navštivte stránku v prohlížeči a změňte si heslo. Všimněte si, že chybová zpráva se zobrazí, pokud zadáte nové heslo, které nesplňuje požadavky na délku hesla a jiné než alfanumerické znaky zadané v konfiguraci členství (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 změní přihlášené heslo uživatele a zobrazí se zobrazení Úspěch.
Odeslání potvrzovacího e-mailu
Ve výchozím nastavení ovládací prvek ChangePassword neodesílá uživateli e-mailovou zprávu, jejíž heslo bylo právě aktualizováno. Pokud chcete poslat e-mail, jednoduše nakonfigurujte vlastnost ovládacího prvku MailDefinition
. Pojďme nakonfigurovat ovládací prvek ChangePassword tak, aby uživatel odeslal 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í kód:
<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 vlastnost BodyFileName
ovládacího prvku MailDefinition
ChangePassword , IsBodyHtml
a Subject
vlastnosti na ~/EmailTemplates/ChangePassword.htm, True a Vaše heslo se změnilo!.
Po provedení těchto změn se 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: E-mailová zpráva 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í v aplikacích, které podporují uživatelské účty, je schopnost správce měnit hesla ostatních uživatelů. Někdy je tato funkce nutná, protože systém nemá možnost uživatelům měnit vlastní hesla. V takovém případě by jediný způsob, jak uživatel obnovit zapomenuté heslo, by správce mu přiřadil nové heslo. S ovládacími prvky PasswordRecovery a ChangePassword ale správci nemusí být zaneprázdněni změnou hesel uživatelů, protože uživatelé si to sami můžou dělat.
Ale co když váš klient trvá na tom, aby správci měli mít možnost změ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 do metody 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, jako je následující:
MembershipUser usr = Membership.GetUser(username);
string resetPwd = 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. Dále je ResetPassword
vyvolána metoda, která přiřadí uživateli nové náhodné heslo. Toto náhodně generované heslo je vráceno metodou a uložena v 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 je nastavena konfigurace systému členství tak, aby RequiresQuestionAndAnswer
byla false. Pokud RequiresQuestionAndAnswer
je true, protože je to v naší aplikaci, pak ResetPassword
musí být metoda předána odpověď zabezpečení, jinak vyvolá výjimku.
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:
- Házejte ruce do vzduchu a řekněte klientovi, že to je jen jedna věc, kterou nelze udělat.
- Nastavte
RequiresQuestionAndAnswer
na false. Výsledkem je méně zabezpečená aplikace. Představte si, že nechtěný uživatel získal přístup k e-mailové složce doručené pošty jiného uživatele. Možná, že napadený uživatel opustil svůj stůl, aby šel na oběd a nezamkl svou pracovní stanici, nebo možná přistupoval ke svým e-mailům z veřejného terminálu a neodhlasoval se. V obou případech může uživatel na stránku navštívitRecoverPassword.aspx
a zadat uživatelské jméno uživatele. Systém pak pošle obnovené heslo e-mailem bez výzvy k zadání odpovědi na zabezpečení. - Vynechat vrstvu abstrakce vytvořenou architekturou Členství a pracovat přímo s databází SQL Serveru. Schéma členství obsahuje uloženou proceduru s názvem
aspnet_Membership_SetPassword
, která nastaví heslo uživatele a k provedení úkolu nevyžaduje odpověď na zabezpečení ani staré heslo.
Žádná z těchto možností není zvlášť atraktivní, ale to je způsob, jak vývojář někdy chodí.
Pokračoval jsem a implementoval třetí přístup, psaní kódu, který obchází Membership
třídy a MembershipUser
pracuje přímo s SecurityTutorials
databází.
Poznámka:
Když pracujete přímo s databází, zapouzdření poskytované architekturou Členství se zatřesí. Toto rozhodnutí nás spojuje s SqlMembershipProvider
tím, že náš kód bude méně přenosný. Tento kód navíc nemusí v budoucích verzích ASP.NET fungovat podle očekávání, pokud se schéma členství změní. Tento přístup je alternativním řešením a podobně jako většina alternativních řešení není příkladem osvědčených postupů.
Kód má několik neattraktivních bitů a je poměrně zdlouhavý. Proto nechci nepotřebné tento kurz s podrobným zkoumá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
stránku. Tato stránka, kterou jsme vytvořili v předchozím kurzu, obsahuje seznam jednotlivých uživatelů. Aktualizoval(a) jsem GridView tak, aby zahrnoval odkaz na UserInformation.aspx
stránku a předal uživatelské jméno vybraného uživatele prostřednictvím řetězce dotazu. Na UserInformation.aspx
stránce se 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 ho potvrdíte ve druhém textovém poli a kliknete na tlačítko Aktualizovat uživatele, vyvolá se postback a aspnet_Membership_SetPassword
uložená procedura se vyvolá a aktualizuje se heslo uživatele. Doporučuji těm čtenářům, kteří se zajímají o tuto funkci, aby se 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 pozváni k přidání této funkce. Doporučujeme přidat potřebný kód, je použít dekompiler, jako je Reflector , k prozkoumání zdrojového kódu 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.
Shrnutí
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í uživatel buď odešle e-mailem své stávající heslo, nebo nové náhodně generované heslo. Ovládací prvek ChangePassword umožňuje uživateli aktualizovat heslo.
Podobně jako login a CreateUserWizard ovládací prvky PasswordRecovery a ChangePassword vykreslují bohaté uživatelské rozhraní bez nutnosti psát lízat deklarativní kód nebo řádek kódu. Pokud výchozí uživatelské rozhraní nevyhovuje vašim potřebám, můžete ho přizpůsobit různými vlastnostmi stylu. Rozhraní ovládacích prvků se také můžou převést na šablony, a to i jemněji. Tyto ovládací prvky na pozadí používají rozhraní API členství, které vyvolává MembershipUser
objekt ResetPassword
a ChangePassword
metody.
Šťastné 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é starty ovládacího prvku PasswordRecovery
- Odesílání e-mailů v ASP.NET
System.Net.Mail
Nejčastější dotazy
O autorovi
Scott Mitchell, autor více knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracoval s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 za 24 hodin. Scott může být dosažitelný na mitchell@4guysfromrolla.com nebo přes svůj blog na http://ScottOnWriting.NET.
Zvláštní díky
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí revidující pro tento kurz zahrnují Michael Emmings a Suchi Banerjee. Chcete si projít nadcházející články MSDN? Pokud ano, zahoďte mi čáru na mitchell@4GuysFromRolla.com