Il nuovo framework ASP.NET Identity contiene già tutta una serie di primitive per la gestione delle problematiche più comuni relative all'autenticazione degli utenti.
Il reset password, per esempio, unitamente alla generazione del token da inviare in email all'utente, è una di queste, ed è facilmente abilitabile dal template di progetto di default in Visual Studio 2013. I passaggi sono molto semplici e, una volta compresa la logica, possiamo facilmente integrare la funzionalità in una nostra applicazione esistente.
Il primo passo è quello di includere un link, per default commentato, su Login.cshtml, che rimandi alla pagina di reset della password:
<p> @Html.ActionLink("Forgot your password?", "ForgotPassword")</p>
La action di GET di ForgotPassword di AccountController è semplicemente una form che chiede l'indirizzo email dell'utente e posta sul medesimo URL. La action di POST, poi, si occupa di inviare la mail di reset all'utente:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model) { if (ModelState.IsValid) { var user = await UserManager.FindByNameAsync(model.Email); if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id))) { // Don't reveal that the user does not exist or is not confirmed return View("ForgotPasswordConfirmation"); } string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>"); return RedirectToAction("ForgotPasswordConfirmation"); } return View(model); }
La logica è molto semplice: innanzi tutto il metodo esegue una verifica sulla correttezza della mail inserita. Come possiamo notare, se questa fallisce, è buona norma dare comunque conferma all'utente del corretto invio della mail, per non fornire informazioni sensibili a un potenziale utente malevolo.
In caso contrario, invochiamo il metodo GeneratePasswordResetTokenAsync di UserManager per generare un nuovo token di reset, che possiamo a questo punto inviare all'utente tramite mail, sotto forma di link alla action ResetPassword. Come possiamo notare, il token appare nella variabile di querystring code.
ResetPassword, nella sua versione in GET, si limita a visualizzare una view di inserimento della nuova password:
[AllowAnonymous] public ActionResult ResetPassword(string code) { return code == null ? View("Error") : View(); }
Ben più interessante è la versione che risponde ai POST, dove abbiamo implementato la logica di reset:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = await UserManager.FindByNameAsync(model.Email); if (user == null) { // Don't reveal that the user does not exist return RedirectToAction("ResetPasswordConfirmation", "Account"); } var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password); if (result.Succeeded) { return RedirectToAction("ResetPasswordConfirmation", "Account"); } AddErrors(result); return View(); }
In particolare, dopo i controlli di validità dell'input, il metodo invoca ResetPasswordAsync che si occupa automaticamente di validare il token, ancora presente in querystring, e di modificare la password dell'utente.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Hosting di componenti WebAssembly in un'applicazione Blazor static
Come migrare da una form non tipizzata a una form tipizzata in Angular
Usare un KeyedService di default in ASP.NET Core 8
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Determinare lo stato di un pod in Kubernetes
Generare file PDF da Blazor WebAssembly con iText
Creare gruppi di client per Event Grid MQTT
Implementare l'infinite scroll con QuickGrid in Blazor Server
Generare file per il download da Blazor WebAssembly
Criptare la comunicazione con mTLS in Azure Container Apps
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Short-circuiting della Pipeline in ASP.NET Core
I più letti di oggi
- Utilizzare WebAssembly con .NET, ovunque
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)