Confirmation du compte et récupération du mot de passe avec ASP.NET Identity (C#)

Avant de suivre ce tutoriel, vous devez d’abord suivre la procédure Créer une application web sécurisée ASP.NET MVC 5 avec connexion, confirmation par e-mail et réinitialisation du mot de passe. Ce tutoriel contient plus de détails et vous montre comment configurer l’e-mail pour la confirmation de compte local et autoriser les utilisateurs à réinitialiser leur mot de passe oublié dans ASP.NET Identity.

Un compte d’utilisateur local nécessite que l’utilisateur crée un mot de passe pour le compte, et ce mot de passe est stocké (en toute sécurité) dans l’application web. ASP.NET Identity prend également en charge les comptes de réseaux sociaux, qui ne nécessitent pas que l’utilisateur crée un mot de passe pour l’application. Les comptes de réseaux sociaux utilisent un tiers (tel que Google, Twitter, Facebook ou Microsoft) pour authentifier les utilisateurs. Cette rubrique couvre les sujets suivants :

Les nouveaux utilisateurs inscrivent leur alias d’e-mail, ce qui crée un compte local.

Image de la fenêtre d’inscription de compte

La sélection du bouton Inscrire envoie un e-mail de confirmation contenant un jeton de validation à leur adresse e-mail.

Image montrant l’e-mail de confirmation envoyé

Un e-mail est envoyé à l’utilisateur avec un jeton de confirmation pour son compte.

Image du jeton de confirmation

La sélection du lien confirme le compte.

Image confirmant l’adresse e-mail

Récupération/réinitialisation de mot de passe

Les utilisateurs locaux qui oublient leur mot de passe peuvent recevoir un jeton de sécurité envoyé à leur compte de messagerie, ce qui leur permet de réinitialiser leur mot de passe.

Image de la fenêtre de réinitialisation de mot de passe oubliée

L’utilisateur recevra bientôt un e-mail avec un lien lui permettant de réinitialiser son mot de passe.

Image montrant l’e-mail de réinitialisation du mot de passe
La sélection du lien les amène à la page Réinitialiser.

Image montrant la fenêtre de réinitialisation du mot de passe utilisateur

Si vous sélectionnez le bouton Réinitialiser , le mot de passe a été réinitialisé.

Image montrant la confirmation de la réinitialisation du mot de passe

Créez une application web ASP.NET

Commencez par installer et exécuter Visual Studio 2017.

  1. Créez un projet web ASP.NET et sélectionnez le modèle MVC. Web Forms également prendre en charge ASP.NET Identity, vous pouvez donc suivre des étapes similaires dans une application de formulaires web.

  2. Remplacez l’authentification par Comptes d’utilisateur individuels.

  3. Exécutez l’application, sélectionnez le lien Inscrire et inscrivez un utilisateur. À ce stade, la seule validation sur l’e-mail est avec l’attribut [EmailAddress].

  4. Dans Server Explorer, accédez à Data Connections\DefaultConnection\Tables\AspNetUsers, cliquez avec le bouton droit et sélectionnez Ouvrir la définition de table.

    L’image suivante montre le AspNetUsers schéma :

    Image montrant le schéma A s p Net Users

  5. Cliquez avec le bouton droit sur la table AspNetUsers et sélectionnez Afficher les données de table.

    Image montrant les données de table

    À ce stade, l’e-mail n’a pas été confirmé.

Le magasin de données par défaut pour ASP.NET Identity est Entity Framework, mais vous pouvez le configurer pour utiliser d’autres magasins de données et pour ajouter des champs supplémentaires. Consultez la section Ressources supplémentaires à la fin de ce tutoriel.

La classe de démarrage OWIN ( Startup.cs ) est appelée lorsque l’application démarre et appelle la ConfigureAuth méthode dans App_Start\Startup.Auth.cs, qui configure le pipeline OWIN et initialise ASP.NET Identity. Examinez la méthode ConfigureAuth. Chaque CreatePerOwinContext appel inscrit un rappel (enregistré dans ) OwinContextqui sera appelé une fois par demande pour créer un instance du type spécifié. Vous pouvez définir un point d’arrêt dans le constructeur et Create la méthode de chaque type (ApplicationDbContext, ApplicationUserManager) et vérifier qu’elles sont appelées sur chaque requête. Une instance de ApplicationDbContext et ApplicationUserManager est stockée dans le contexte OWIN, accessible dans l’ensemble de l’application. ASP.NET Identity se connecte au pipeline OWIN par le biais d’un intergiciel de cookie. Pour plus d’informations, consultez Gestion de la durée de vie par requête pour la classe UserManager dans ASP.NET Identity.

Lorsque vous modifiez votre profil de sécurité, une nouvelle empreinte de sécurité est générée et stockée dans le SecurityStamp champ de la table AspNetUsers . Notez que le SecurityStamp champ est différent du cookie de sécurité. Le cookie de sécurité n’est pas stocké dans la AspNetUsers table (ni ailleurs dans la base de données d’identité). Le jeton de cookie de sécurité est auto-signé à l’aide de DPAPI et est créé avec les informations sur le UserId, SecurityStamp délai d’expiration et.

L’intergiciel cookie vérifie le cookie à chaque demande. La SecurityStampValidator méthode de la Startup classe atteint la base de données et vérifie régulièrement l’empreinte de sécurité, comme spécifié avec le validateInterval. Cela ne se produit que toutes les 30 minutes (dans notre exemple), sauf si vous modifiez votre profil de sécurité. L’intervalle de 30 minutes a été choisi pour réduire les déplacements vers la base de données. Pour plus d’informations, consultez mon tutoriel sur l’authentification à deux facteurs.

Selon les commentaires dans le code, la méthode prend en charge l’authentification UseCookieAuthentication par cookie. Le SecurityStamp champ et le code associé fournissent une couche de sécurité supplémentaire à votre application. Lorsque vous modifiez votre mot de passe, vous êtes déconnecté du navigateur avec lequel vous vous êtes connecté. La SecurityStampValidator.OnValidateIdentity méthode permet à l’application de valider le jeton de sécurité lorsque l’utilisateur se connecte, qui est utilisé lorsque vous modifiez un mot de passe ou utilisez la connexion externe. Cela est nécessaire pour garantir que tous les jetons (cookies) générés avec l’ancien mot de passe sont invalidés. Dans l’exemple de projet, si vous modifiez le mot de passe de l’utilisateur, un nouveau jeton est généré pour l’utilisateur, tous les jetons précédents sont invalidés et le SecurityStamp champ est mis à jour.

Le système d’identité vous permet de configurer votre application afin que lorsque le profil de sécurité des utilisateurs change (par exemple, lorsque l’utilisateur modifie son mot de passe ou modifie la connexion associée (par exemple, à partir de Facebook, Google, compte Microsoft, etc.), l’utilisateur est déconnecté de toutes les instances de navigateur. Par exemple, l’image ci-dessous montre l’exemple d’application de déconnexion unique , qui permet à l’utilisateur de se déconnecter de toutes les instances de navigateur (dans ce cas, IE, Firefox et Chrome) en sélectionnant un bouton. L’exemple vous permet également de vous déconnecter uniquement d’un navigateur spécifique instance.

Image montrant l’exemple de fenêtre d’application de déconnexion unique

L’exemple d’application de déconnexion unique montre comment ASP.NET Identity vous permet de régénérer le jeton de sécurité. Cela est nécessaire pour garantir que tous les jetons (cookies) générés avec l’ancien mot de passe sont invalidés. Cette fonctionnalité fournit une couche de sécurité supplémentaire à votre application ; lorsque vous modifiez votre mot de passe, vous êtes déconnecté à l’endroit où vous vous êtes connecté à cette application.

Le fichier App_Start\IdentityConfig.cs contient les ApplicationUserManagerclasses et EmailServiceSmsService . Les EmailService classes et SmsService implémentent chacune l’interface IIdentityMessageService . Vous disposez donc de méthodes courantes dans chaque classe pour configurer l’e-mail et les SMS. Bien que ce tutoriel montre uniquement comment ajouter une notification par e-mail via SendGrid, vous pouvez envoyer des e-mails à l’aide de SMTP et d’autres mécanismes.

La Startup classe contient également une plaque de chaudière pour ajouter des connexions sociales (Facebook, Twitter, etc.), consultez mon tutoriel Application MVC 5 avec Facebook, Twitter, LinkedIn et Google OAuth2 Sign-on pour plus d’informations.

Examinez la ApplicationUserManager classe, qui contient les informations d’identité des utilisateurs et configure les fonctionnalités suivantes :

  • Exigences relatives à la force du mot de passe.
  • Verrouillage de l’utilisateur (tentatives et heure).
  • Authentification à deux facteurs (2FA). Je vais couvrir 2FA et SMS dans un autre tutoriel.
  • Raccordement des services de messagerie et de SMS. (Je vais couvrir les SMS dans un autre tutoriel).

La ApplicationUserManager classe dérive de la classe générique UserManager<ApplicationUser> . ApplicationUser dérive d’IdentityUser. IdentityUser dérive de la classe générique IdentityUser :

//     Default EntityFramework IUser implementation
public class IdentityUser<TKey, TLogin, TRole, TClaim> : IUser<TKey>
   where TLogin : IdentityUserLogin<TKey>
   where TRole : IdentityUserRole<TKey>
   where TClaim : IdentityUserClaim<TKey>
{
   public IdentityUser()
   {
      Claims = new List<TClaim>();
      Roles = new List<TRole>();
      Logins = new List<TLogin>();
   }

   ///     User ID (Primary Key)
   public virtual TKey Id { get; set; }

   public virtual string Email { get; set; }
   public virtual bool EmailConfirmed { get; set; }

   public virtual string PasswordHash { get; set; }

   ///     A random value that should change whenever a users credentials have changed (password changed, login removed)
   public virtual string SecurityStamp { get; set; }

   public virtual string PhoneNumber { get; set; }
   public virtual bool PhoneNumberConfirmed { get; set; }

   public virtual bool TwoFactorEnabled { get; set; }

   ///     DateTime in UTC when lockout ends, any time in the past is considered not locked out.
   public virtual DateTime? LockoutEndDateUtc { get; set; }

   public virtual bool LockoutEnabled { get; set; }

   ///     Used to record failures for the purposes of lockout
   public virtual int AccessFailedCount { get; set; }
   
   ///     Navigation property for user roles
   public virtual ICollection<TRole> Roles { get; private set; }

   ///     Navigation property for user claims
   public virtual ICollection<TClaim> Claims { get; private set; }

   ///     Navigation property for user logins
   public virtual ICollection<TLogin> Logins { get; private set; }
   
   public virtual string UserName { get; set; }
}

Les propriétés ci-dessus coïncident avec les propriétés du AspNetUsers tableau ci-dessus.

Les arguments génériques sur IUser permettent de dériver une classe à l’aide de différents types pour la clé primaire. Consultez l’exemple ChangePK qui montre comment changer la clé primaire de chaîne en int ou GUID.

ApplicationUser

ApplicationUser (public class ApplicationUserManager : UserManager<ApplicationUser>) est défini dans Models\IdentityModels.cs comme suit :

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(
        UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in 
       //   CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, 
    DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

Le code mis en surbrillance ci-dessus génère un ClaimsIdentity. ASP.NET Identity et l’authentification par cookie OWIN sont basées sur des revendications. Par conséquent, l’infrastructure exige que l’application génère un ClaimsIdentity pour l’utilisateur. ClaimsIdentity contient des informations sur toutes les revendications de l’utilisateur, telles que son nom, son âge et les rôles auxquels il appartient. Vous pouvez également ajouter d’autres revendications pour l’utilisateur à ce stade.

La méthode OWIN AuthenticationManager.SignIn transmet le ClaimsIdentity et connecte l’utilisateur :

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties(){
       IsPersistent = isPersistent }, 
       await user.GenerateUserIdentityAsync(UserManager));
}

L’application MVC 5 avec Facebook, Twitter, LinkedIn et Google OAuth2 Sign-on montre comment ajouter des propriétés supplémentaires à la ApplicationUser classe.

Email confirmation

Il est judicieux de confirmer l’e-mail avec lequel un nouvel utilisateur s’inscrit pour vérifier qu’il n’emprunte pas l’identité d’une autre personne (autrement dit, il ne s’est pas inscrit auprès de l’e-mail d’une autre personne). Supposons que vous disposiez d’un forum de discussion, vous souhaitez empêcher "bob@example.com" l’inscription en tant que "joe@contoso.com". Sans confirmation par e-mail, "joe@contoso.com" peut recevoir des e-mails indésirables à partir de votre application. Supposons que Bob s’est inscrit accidentellement comme "bib@example.com" et qu’il ne l’avait pas remarqué, il ne serait pas en mesure d’utiliser la récupération de mot de passe, car l’application n’a pas son e-mail correct. Email confirmation fournit une protection limitée contre les bots et ne fournit pas de protection contre les spammeurs déterminés, ils ont de nombreux alias de messagerie de travail qu’ils peuvent utiliser pour s’inscrire. Dans l’exemple ci-dessous, l’utilisateur ne pourra pas modifier son mot de passe tant que son compte n’aura pas été confirmé (en sélectionnant un lien de confirmation reçu sur le compte de messagerie avec lequel il s’est inscrit.) Vous pouvez appliquer ce flux de travail à d’autres scénarios, par exemple l’envoi d’un lien pour confirmer et réinitialiser le mot de passe sur les nouveaux comptes créés par l’administrateur, l’envoi d’un e-mail à l’utilisateur lorsqu’il a modifié son profil, etc. Vous souhaitez généralement empêcher les nouveaux utilisateurs de publier des données sur votre site web avant qu’elles aient été confirmées par e-mail, sms ou autre mécanisme.

Créer un exemple plus complet

Dans cette section, vous allez utiliser NuGet pour télécharger un exemple plus complet avec lequel nous allons travailler.

  1. Créez un projet web vide ASP.NET.

  2. Dans la console du Gestionnaire de package, entrez les commandes suivantes :

    Install-Package SendGrid
    Install-Package -Prerelease Microsoft.AspNet.Identity.Samples
    

    Dans ce tutoriel, nous allons utiliser SendGrid pour envoyer des e-mails. Le Identity.Samples package installe le code avec lequel nous allons travailler.

  3. Définissez le projet pour utiliser SSL.

  4. Testez la création de compte local en exécutant l’application, en sélectionnant le lien Inscrire et en publiant le formulaire d’inscription.

  5. Sélectionnez le lien d’e-mail de démonstration, qui simule la confirmation par e-mail.

  6. Supprimez le code de confirmation du lien de l’e-mail de démonstration de l’exemple (code ViewBag.Link dans le contrôleur de compte. Consultez les méthodes d’action DisplayEmail et et ForgotPasswordConfirmation les vues razor ).

Avertissement

Si vous modifiez l’un des paramètres de sécurité de cet exemple, les applications de production devront subir un audit de sécurité qui appelle explicitement les modifications apportées.

Examiner le code dans App_Start\IdentityConfig.cs

L’exemple montre comment créer un compte et l’ajouter au rôle Administration. Vous devez remplacer l’e-mail dans l’exemple par l’e-mail que vous allez utiliser pour le compte d’administrateur. La méthode la plus simple pour créer un compte d’administrateur est la méthode programmatiquement Seed . Nous espérons disposer à l’avenir d’un outil qui vous permettra de créer et d’administrer des utilisateurs et des rôles. L’exemple de code vous permet de créer et de gérer des utilisateurs et des rôles, mais vous devez d’abord disposer d’un compte d’administrateur pour exécuter les rôles et les pages d’administration des utilisateurs. Dans cet exemple, le compte d’administrateur est créé lorsque la base de données est amorçage.

Modifiez le mot de passe et remplacez le nom par un compte dans lequel vous pouvez recevoir Notifications par e-mail.

Avertissement

Sécurité : ne stockez jamais de données sensibles dans votre code source.

Comme mentionné précédemment, l’appel app.CreatePerOwinContext dans la classe de démarrage ajoute des rappels à la méthode du contenu de la Create base de données d’application, au gestionnaire d’utilisateurs et aux classes de gestionnaire de rôle. Le pipeline OWIN appelle la Create méthode sur ces classes pour chaque requête et stocke le contexte de chaque classe. Le contrôleur de compte expose le gestionnaire d’utilisateurs à partir du contexte HTTP (qui contient le contexte OWIN) :

public ApplicationUserManager UserManager
{
    get
    {
        return _userManager ?? 
    HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
    }
    private set
    {
        _userManager = value;
    }
}

Lorsqu’un utilisateur inscrit un compte local, la HTTP Post Register méthode est appelée :

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
        var result = await UserManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
            var callbackUrl = Url.Action(
               "ConfirmEmail", "Account", 
               new { userId = user.Id, code = code }, 
               protocol: Request.Url.Scheme);

            await UserManager.SendEmailAsync(user.Id, 
               "Confirm your account", 
               "Please confirm your account by clicking this link: <a href=\"" 
                                               + callbackUrl + "\">link</a>");
            // ViewBag.Link = callbackUrl;   // Used only for initial demo.
            return View("DisplayEmail");
        }
        AddErrors(result);
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Le code ci-dessus utilise les données du modèle pour créer un compte d’utilisateur à l’aide de l’e-mail et du mot de passe entrés. Si l’alias d’e-mail se trouve dans le magasin de données, la création du compte échoue et le formulaire s’affiche à nouveau. La GenerateEmailConfirmationTokenAsync méthode crée un jeton de confirmation sécurisé et le stocke dans le magasin de données ASP.NET Identity. La méthode Url.Action crée un lien contenant le UserId jeton de confirmation et. Ce lien est ensuite envoyé par e-mail à l’utilisateur. L’utilisateur peut sélectionner le lien dans son application de messagerie pour confirmer son compte.

Configurer la confirmation par e-mail

Accédez à la page d’inscription à SendGrid et inscrivez-vous à un compte gratuit. Ajoutez du code similaire à ce qui suit pour configurer SendGrid :

public class EmailService : IIdentityMessageService
{
   public Task SendAsync(IdentityMessage message)
   {
      return configSendGridasync(message);
   }

   private Task configSendGridasync(IdentityMessage message)
   {
      var myMessage = new SendGridMessage();
      myMessage.AddTo(message.Destination);
      myMessage.From = new System.Net.Mail.MailAddress(
                          "Joe@contoso.com", "Joe S.");
      myMessage.Subject = message.Subject;
      myMessage.Text = message.Body;
      myMessage.Html = message.Body;

      var credentials = new NetworkCredential(
                 ConfigurationManager.AppSettings["mailAccount"],
                 ConfigurationManager.AppSettings["mailPassword"]
                 );

      // Create a Web transport for sending email.
      var transportWeb = new Web(credentials);

      // Send the email.
      if (transportWeb != null)
      {
         return transportWeb.DeliverAsync(myMessage);
      }
      else
      {
         return Task.FromResult(0);
      }
   }
}

Notes

Email clients acceptent fréquemment uniquement les messages texte (pas de code HTML). Vous devez fournir le message en texte et html. Dans l’exemple SendGrid ci-dessus, cela s’effectue avec le myMessage.Text code et myMessage.Html indiqué ci-dessus.

Le code suivant montre comment envoyer des e-mails à l’aide de la classe MailMessagemessage.Body retourne uniquement le lien.

void sendMail(Message message)
{
#region formatter
   string text = string.Format("Please click on this link to {0}: {1}", message.Subject, message.Body);
   string html = "Please confirm your account by clicking this link: <a href=\"" + message.Body + "\">link</a><br/>";

   html += HttpUtility.HtmlEncode(@"Or click on the copy the following link on the browser:" + message.Body);
#endregion

   MailMessage msg = new MailMessage();
   msg.From = new MailAddress("joe@contoso.com");
   msg.To.Add(new MailAddress(message.Destination));
   msg.Subject = message.Subject;
   msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(text, null, MediaTypeNames.Text.Plain));
   msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html));

   SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", Convert.ToInt32(587));
   System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("joe@contoso.com", "XXXXXX");
   smtpClient.Credentials = credentials;
   smtpClient.EnableSsl = true;
   smtpClient.Send(msg);
}

Avertissement

Sécurité : ne stockez jamais de données sensibles dans votre code source. Le compte et les informations d’identification sont stockés dans appSetting. Sur Azure, vous pouvez stocker ces valeurs en toute sécurité sous l’onglet Configurer dans le Portail Azure. Consultez Bonnes pratiques pour le déploiement de mots de passe et d’autres données sensibles sur ASP.NET et Azure.

Entrez vos informations d’identification SendGrid, exécutez l’application, inscrivez-vous avec un alias d’e-mail pour sélectionner le lien confirmer dans votre e-mail. Pour savoir comment procéder avec votre compte de messagerie Outlook.com , consultez Configuration SMTP C# de John Atten pour Outlook.Com hôte SMTP et sonASP.NET Identity 2.0 : Configuration de la validation de compte et des publications d’autorisation de Two-Factor .

Une fois qu’un utilisateur sélectionne le bouton Inscrire , un e-mail de confirmation contenant un jeton de validation est envoyé à son adresse e-mail.

Image de la fenêtre de confirmation envoyée par e-mail

Un e-mail est envoyé à l’utilisateur avec un jeton de confirmation pour son compte.

Image de l’e-mail reçu

Examiner le code

Le code suivant montre la méthode POST ForgotPassword.

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");
        }

        var 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 here: <a href=\"" + callbackUrl + "\">link</a>");        
        return View("ForgotPasswordConfirmation");
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

La méthode échoue en mode silencieux si l’e-mail de l’utilisateur n’a pas été confirmé. Si une erreur a été publiée pour une adresse e-mail non valide, les utilisateurs malveillants peuvent utiliser ces informations pour rechercher un id d’utilisateur valide (alias d’e-mail) pour attaquer.

Le code suivant montre la ConfirmEmail méthode dans le contrôleur de compte appelée lorsque l’utilisateur sélectionne le lien de confirmation dans l’e-mail qui lui est envoyé :

public async Task<ActionResult> ConfirmEmail(string userId, string code)
{
    if (userId == null || code == null)
    {
        return View("Error");
    }
    var result = await UserManager.ConfirmEmailAsync(userId, code);
    if (result.Succeeded)
    {
        return View("ConfirmEmail");
    }
    AddErrors(result);
    return View();
}

Une fois qu’un jeton de mot de passe oublié a été utilisé, il est invalidé. Le changement de code suivant dans la Create méthode (dans le fichier App_Start\IdentityConfig.cs ) définit l’expiration des jetons dans trois heures.

if (dataProtectionProvider != null)
 {
    manager.UserTokenProvider =
       new DataProtectorTokenProvider<ApplicationUser>
          (dataProtectionProvider.Create("ASP.NET Identity"))
          {                    
             TokenLifespan = TimeSpan.FromHours(3)
          };
 }

Avec le code ci-dessus, le mot de passe oublié et les jetons de confirmation d’e-mail expirent dans 3 heures. La valeur par défaut TokenLifespan est un jour.

Le code suivant montre la méthode de confirmation par e-mail :

// GET: /Account/ConfirmEmail
[AllowAnonymous]
public async Task<ActionResult> ConfirmEmail(string userId, string code)
{
   if (userId == null || code == null)
   {
      return View("Error");
   }
   IdentityResult result;
   try
   {
      result = await UserManager.ConfirmEmailAsync(userId, code);
   }
   catch (InvalidOperationException ioe)
   {
      // ConfirmEmailAsync throws when the userId is not found.
      ViewBag.errorMessage = ioe.Message;
      return View("Error");
   }

   if (result.Succeeded)
   {
      return View();
   }

   // If we got this far, something failed.
   AddErrors(result);
   ViewBag.errorMessage = "ConfirmEmail failed";
   return View("Error");
}

Pour sécuriser votre application, ASP.NET Identity prend en charge l’authentification Two-Factor (2FA). Consultez ASP.NET Identity 2.0 : Configuration de la validation de compte et de l’autorisation Two-Factor par John Atten. Bien que vous puissiez définir le verrouillage de compte en cas d’échec de tentative de mot de passe de connexion, cette approche rend votre connexion vulnérable aux verrouillages DOS . Nous vous recommandons d’utiliser le verrouillage de compte uniquement avec 2FA.

Ressources supplémentaires