Bagikan melalui


Konfirmasi akun dan pemulihan kata sandi dengan identitas ASP.NET (C#)

Sebelum melakukan tutorial ini, Anda harus terlebih dahulu menyelesaikan Membuat aplikasi web ASP.NET MVC 5 yang aman dengan masuk, konfirmasi email, dan pengaturan ulang kata sandi. Tutorial ini berisi detail selengkapnya dan akan menunjukkan kepada Anda cara menyiapkan email untuk konfirmasi akun lokal dan memungkinkan pengguna untuk mengatur ulang kata sandi yang terlupakan di identitas ASP.NET.

Akun pengguna lokal mengharuskan pengguna membuat kata sandi untuk akun tersebut, dan kata sandi tersebut disimpan (dengan aman) di aplikasi web. ASP.NET Identity juga mendukung akun sosial, yang tidak mengharuskan pengguna membuat kata sandi untuk aplikasi. Akun sosial menggunakan pihak ketiga (seperti Google, Twitter, Facebook, atau Microsoft) untuk mengautentikasi pengguna. Topik ini mencakup hal-hal berikut:

Pengguna baru mendaftarkan alias email mereka, yang membuat akun lokal.

Gambar jendela pendaftaran akun

Memilih tombol Daftar mengirimkan email konfirmasi yang berisi token validasi ke alamat email mereka.

gambar memperlihatkan konfirmasi pengiriman email

Pengguna dikirimi email dengan token konfirmasi untuk akun mereka.

Gambar token konfirmasi

Memilih tautan mengonfirmasi akun.

gambar mengonfirmasi alamat email

Pemulihan/reset kata sandi

Pengguna lokal yang lupa kata sandi mereka dapat memiliki token keamanan yang dikirim ke akun email mereka, memungkinkan mereka untuk mengatur ulang kata sandi mereka.

Gambar jendela reset kata sandi yang terlupakan

Pengguna akan segera mendapatkan email dengan tautan yang memungkinkan mereka untuk mengatur ulang kata sandi mereka.

gambar menampilkan email pengaturan ulang kata sandi
Memilih tautan akan membawanya ke halaman Reset.

Gambar memperlihatkan jendela reset kata sandi pengguna

Memilih tombol Reset akan mengonfirmasi bahwa kata sandi telah direset.

gambar memperlihatkan konfirmasi pengaturan ulang kata sandi

Membuat aplikasi web ASP.NET

Mulailah dengan menginstal dan menjalankan Visual Studio 2017.

  1. Buat proyek Web ASP.NET baru dan pilih templat MVC. Formulir Web juga mendukung identitas ASP.NET, sehingga Anda dapat mengikuti langkah-langkah serupa di aplikasi formulir web.

  2. Ubah autentikasi menjadi Akun Pengguna Individual.

  3. Jalankan aplikasi, pilih tautan Daftarkan dan daftarkan pengguna. Pada titik ini, satu-satunya validasi pada email adalah dengan atribut [EmailAddress] .

  4. Di Server Explorer, navigasikan ke Koneksi Data\DefaultConnection\Tables\AspNetUsers, klik kanan dan pilih Buka definisi tabel.

    Gambar berikut menunjukkan skema AspNetUsers:

    Gambar memperlihatkan skema Pengguna Asp Net

  5. Klik kanan pada tabel AspNetUsers dan pilih Tampilkan Data Tabel.

    Gambar memperlihatkan data tabel

    Pada titik ini email belum dikonfirmasi.

Penyimpanan data default untuk identitas ASP.NET adalah Kerangka Kerja Entitas, tetapi Anda dapat mengonfigurasinya untuk menggunakan penyimpanan data lain dan untuk menambahkan bidang tambahan. Lihat bagian Sumber Daya Tambahan di akhir tutorial ini.

Kelas startup OWIN ( Startup.cs ) dipanggil saat aplikasi dimulai dan memanggil metode di App_Start\Startup.Auth.cs, yang mengonfigurasi pipeline OWIN dan menginisialisasi ASP.NET Identity. Periksa metode ConfigureAuth. Setiap panggilan CreatePerOwinContext mendaftarkan panggilan balik (disimpan dalam OwinContext) yang akan dipanggil sekali per permintaan untuk membuat instans dari jenis yang ditentukan. Anda dapat mengatur titik henti pada konstruktor dan metode Create dari masing-masing tipe (ApplicationDbContext, ApplicationUserManager) dan memverifikasi bahwa keduanya dipanggil pada setiap permintaan. Instans ApplicationDbContext dan ApplicationUserManager disimpan dalam konteks OWIN, yang dapat diakses di seluruh aplikasi. ASP.NET Identity terhubung ke alur OWIN melalui middleware cookie. Untuk informasi selengkapnya, lihat manajemen seumur hidup Per permintaan untuk kelas UserManager di ASP.NET Identity.

Saat Anda mengubah profil keamanan, stempel keamanan baru dibuat dan disimpan di bidang tabel AspNetUsers . Perhatikan, bidang SecurityStamp berbeda dari cookie keamanan. Cookie keamanan tidak disimpan dalam tabel AspNetUsers (atau di tempat lain di DB Identitas). Token cookie keamanan ditandatangani sendiri menggunakan DPAPI dan dibuat dengan informasi UserId, SecurityStamp dan waktu kedaluwarsa.

Middleware cookie memeriksa cookie pada setiap permintaan. Metode SecurityStampValidator di kelas Startup mengakses DB dan memeriksa stempel keamanan secara berkala, sesuai dengan yang ditentukan oleh validateInterval. Ini hanya terjadi setiap 30 menit (dalam sampel kami) kecuali Anda mengubah profil keamanan Anda. Interval 30 menit dipilih untuk meminimalkan perjalanan ke database. Lihat tutorial autentikasi dua faktor saya untuk detail selengkapnya.

Sesuai komentar dalam kode, metode UseCookieAuthentication mendukung autentikasi cookie. Bidang SecurityStamp dan kode terkait menyediakan lapisan keamanan tambahan untuk aplikasi Anda, saat Anda mengubah kata sandi, Anda akan keluar dari browser yang Anda gunakan untuk masuk. Metode SecurityStampValidator.OnValidateIdentity memungkinkan aplikasi untuk memvalidasi token keamanan saat pengguna masuk, yang digunakan saat Anda mengubah kata sandi atau menggunakan login eksternal. Ini diperlukan untuk memastikan bahwa setiap token (cookie) yang dihasilkan dengan kata sandi lama tidak valid. Dalam proyek sampel, jika Anda mengubah kata sandi pengguna, maka token baru dihasilkan untuk pengguna, token sebelumnya tidak valid dan bidang SecurityStamp diperbarui.

Sistem Identitas memungkinkan Anda mengonfigurasi aplikasi sehingga saat profil keamanan pengguna berubah (misalnya, saat pengguna mengubah kata sandi mereka atau mengubah login terkait (seperti dari Facebook, Google, akun Microsoft, dll.), pengguna akan keluar dari semua instans browser. Misalnya, gambar di bawah ini menunjukkan sampel aplikasi Single signout, yang memungkinkan pengguna untuk keluar dari semua instans browser (dalam hal ini, IE, Firefox dan Chrome) dengan memilih satu tombol. Sebagai alternatif, sampel memungkinkan Anda hanya keluar dari instance browser tertentu.

Gambar memperlihatkan jendela aplikasi sampel keluar sekali

Contoh aplikasi Single signout menunjukkan bagaimana ASP.NET Identity memungkinkan Anda untuk menghasilkan kembali token keamanan. Ini diperlukan untuk memastikan bahwa setiap token (cookie) yang dihasilkan dengan kata sandi lama tidak valid. Fitur ini menyediakan lapisan keamanan tambahan untuk aplikasi Anda; ketika Anda mengubah kata sandi, Anda akan keluar di mana Anda telah masuk ke aplikasi ini.

File App_Start\IdentityConfig.cs berisi kelas ApplicationUserManager, EmailService, dan SmsService. Kelas EmailService dan SmsService masing-masing mengimplementasikan antarmuka IIdentityMessageService, sehingga Anda memiliki metode umum di setiap kelas untuk mengonfigurasi email dan SMS. Meskipun tutorial ini hanya menunjukkan cara menambahkan pemberitahuan email melalui SendGrid, Anda dapat mengirim email menggunakan SMTP dan mekanisme lainnya.

Kelas Startup juga berisi kode template untuk menambahkan login sosial (Facebook, Twitter, dll.), lihat tutorial saya Aplikasi MVC 5 dengan Facebook, Twitter, LinkedIn, dan Google OAuth2 Sign-on untuk informasi selengkapnya.

Periksa kelas ApplicationUserManager, yang berisi informasi identitas pengguna dan konfigurasikan fitur berikut:

  • Persyaratan kekuatan kata sandi.
  • Penguncian pengguna (upaya dan waktu).
  • Autentikasi dua faktor (2FA). Saya akan membahas 2FA dan SMS dalam tutorial lain.
  • Menghubungkan layanan email dan SMS. (Saya akan membahas SMS dalam tutorial lain).

Kelas ApplicationUserManager berasal dari kelas UserManager<ApplicationUser> generik. ApplicationUser berasal dari IdentityUser. IdentityUser berasal dari kelas IdentityUser generik:

//     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; }
}

Properti di atas bertepatan dengan properti dalam tabel AspNetUsers, yang ditunjukkan di atas.

Argumen generik pada IUser memungkinkan Anda memperoleh kelas menggunakan jenis yang berbeda untuk kunci utama. Lihat sampel ChangePK yang menunjukkan cara mengubah kunci utama dari string ke int atau GUID.

ApplicationUser

ApplicationUser (public class ApplicationUserManager : UserManager<ApplicationUser>) didefinisikan dalam Model\IdentityModels.cs sebagai:

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

Kode yang disorot di atas menghasilkan sebuah objek ClaimsIdentity. ASP.NET Identity dan OWIN Cookie Authentication berbasis klaim, oleh karena itu kerangka kerja mengharuskan aplikasi untuk menghasilkan ClaimsIdentity bagi pengguna. ClaimsIdentity memiliki informasi tentang semua klaim untuk pengguna, seperti nama pengguna, usia, dan peran apa yang dimiliki pengguna. Anda juga dapat menambahkan lebih banyak klaim untuk pengguna pada tahap ini.

Metode OWIN AuthenticationManager.SignIn melewati ClaimsIdentity dan melakukan login pengguna.

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

Aplikasi MVC 5 dengan Masuk Facebook, Twitter, LinkedIn, dan Google OAuth2 menunjukkan bagaimana Anda dapat menambahkan properti tambahan ke kelas ApplicationUser.

Konfirmasi email

Ada baiknya untuk mengonfirmasi email yang didaftarkan pengguna baru untuk memverifikasi bahwa mereka tidak meniru orang lain (artinya, mereka belum mendaftar dengan email orang lain). Misalkan Anda memiliki forum diskusi, Anda ingin mencegah "bob@example.com" mendaftar sebagai "joe@contoso.com". Tanpa konfirmasi email, "joe@contoso.com" bisa mendapatkan email yang tidak diinginkan dari aplikasi Anda. Misalkan Bob secara tidak sengaja terdaftar sebagai "bib@example.com" dan tidak menyadarinya, dia tidak akan dapat menggunakan pemulihan kata sandi karena aplikasi tidak memiliki email yang benar. Konfirmasi email hanya memberikan perlindungan terbatas dari bot dan tidak memberikan perlindungan dari spammer yang ditentukan, mereka memiliki banyak alias email yang berfungsi yang dapat mereka gunakan untuk mendaftar. Dalam sampel di bawah ini, pengguna tidak akan dapat mengubah kata sandi mereka sampai akun mereka telah dikonfirmasi (oleh mereka memilih tautan konfirmasi yang diterima pada akun email yang mereka daftarkan.) Anda dapat menerapkan alur kerja ini ke skenario lain, misalnya mengirim tautan untuk mengonfirmasi dan mengatur ulang kata sandi pada akun baru yang dibuat oleh administrator, mengirim email kepada pengguna ketika mereka telah mengubah profil mereka dan sebagainya. Anda umumnya ingin mencegah pengguna baru memposting data apa pun ke situs web Anda sebelum mereka dikonfirmasi melalui email, pesan teks SMS, atau mekanisme lain.

Membuat sampel yang lebih lengkap

Di bagian ini, Anda akan menggunakan NuGet untuk mengunduh contoh yang lebih lengkap yang akan kami gunakan.

  1. Buat proyek Web baru kosong ASP.NET.

  2. Di Konsol Manajer Paket, masukkan perintah berikut:

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

    Dalam tutorial ini, kita akan menggunakan SendGrid untuk mengirim email. Paket Identity.Samples menginstal kode yang akan kami kerjakan.

  3. Atur proyek untuk menggunakan SSL.

  4. Uji pembuatan akun lokal dengan menjalankan aplikasi, memilih tautan Daftarkan, dan posting formulir pendaftaran.

  5. Pilih tautan email demo, yang mensimulasikan konfirmasi email.

  6. Hapus kode konfirmasi tautan email demo dari sampel (Kode ViewBag.Link di pengontrol akun. Lihat metode tindakan DisplayEmail dan ForgotPasswordConfirmation dan tampilan pisau cukur ).

Peringatan

Jika Anda mengubah salah satu pengaturan keamanan dalam sampel ini, aplikasi produksi harus menjalani audit keamanan yang secara eksplisit memanggil perubahan yang dibuat.

Periksa kode di App_Start\IdentityConfig.cs

Contoh menunjukkan cara membuat akun dan menambahkannya ke peran Admin. Anda harus mengganti email dalam sampel dengan email yang akan Anda gunakan untuk akun admin. Cara termudah saat ini untuk membuat akun administrator adalah secara terprogram dalam metode Seed. Kami berharap memiliki alat di masa depan yang akan memungkinkan Anda membuat dan mengelola pengguna dan peran. Kode sampel memungkinkan Anda membuat dan mengelola pengguna dan peran, tetapi Anda harus terlebih dahulu memiliki akun administrator untuk menjalankan peran dan halaman admin pengguna. Dalam sampel ini, akun admin dibuat saat DB disemai.

Ubah kata sandi dan ubah nama menjadi akun tempat Anda dapat menerima pemberitahuan email.

Peringatan

Keamanan - Jangan pernah menyimpan data sensitif dalam kode sumber Anda.

Seperti disebutkan sebelumnya, panggilan app.CreatePerOwinContext di kelas startup menambahkan callback ke metode Create dari konten DB aplikasi, kelas manajer pengguna, dan manajer peran. Alur OWIN memanggil metode Create pada kelas ini untuk setiap permintaan dan menyimpan konteks untuk setiap kelas. Pengontrol akun mengekspos manajer pengguna dari konteks HTTP (yang berisi konteks OWIN):

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

Saat pengguna mendaftarkan akun lokal, metode HTTP Post Register disebut:

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

Kode di atas menggunakan data model untuk membuat akun pengguna baru menggunakan email dan kata sandi yang dimasukkan. Jika alias email berada di penyimpanan data, pembuatan akun gagal dan formulir ditampilkan lagi. Metode GenerateEmailConfirmationTokenAsync membuat token konfirmasi yang aman dan menyimpannya di penyimpanan data identitas ASP.NET. Metode Url.Action membuat tautan yang berisi token dan konfirmasi. Tautan ini kemudian dikirim melalui email kepada pengguna, pengguna dapat memilih tautan di aplikasi email mereka untuk mengonfirmasi akun mereka.

Menyiapkan konfirmasi email

Buka halaman pendaftaran SendGrid dan daftar untuk akun gratis. Tambahkan kode yang mirip dengan yang berikut ini untuk mengonfigurasi 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);
      }
   }
}

Nota

Klien email sering menerima hanya pesan teks (tanpa HTML). Anda harus memberikan pesan dalam teks dan HTML. Dalam sampel SendGrid di atas, ini dilakukan dengan kode myMessage.Text dan myMessage.Html yang ditunjukkan di atas.

Kode berikut menunjukkan cara mengirim email menggunakan kelas MailMessage di mana hanya mengembalikan tautan.

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

Peringatan

Keamanan - Jangan pernah menyimpan data sensitif dalam kode sumber Anda. Akun dan kredensial disimpan di appSetting. Di Azure, Anda dapat menyimpan nilai-nilai ini dengan aman di tab Konfigurasikan di portal Microsoft Azure. Lihat praktik terbaik untuk menyebarkan kata sandi dan data sensitif lainnya ke ASP.NET dan Azure.

Masukkan kredensial SendGrid Anda, jalankan aplikasi, daftar dengan alias email dapat memilih tautan konfirmasi di email Anda. Untuk melihat cara melakukan ini dengan akun email Outlook.com Anda, lihat Konfigurasi C# SMTP John Atten untuk Outlook.Com Host SMTP dan IdentitasASP.NET 2.0: Menyiapkan Validasi Akun dan Two-Factor Posting Otorisasi.

Setelah pengguna memilih tombol Daftarkan, email konfirmasi yang berisi token validasi dikirim ke alamat email mereka.

Gambar jendela konfirmasi email yang dikirim

Pengguna dikirimi email dengan token konfirmasi untuk akun mereka.

Gambar email yang diterima

Memeriksa kode

Kode berikut menunjukkan metode 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);
}

Metode gagal secara diam-diam jika email pengguna belum dikonfirmasi. Jika kesalahan diposting untuk alamat email yang tidak valid, pengguna berbahaya dapat menggunakan informasi tersebut untuk menemukan userId (alias email) yang valid untuk menyerang.

Kode berikut menunjukkan metode ConfirmEmail di pengontrol akun yang dipanggil saat pengguna memilih tautan konfirmasi dalam email yang dikirim kepada mereka:

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

Setelah token kata sandi yang terlupakan digunakan, token tersebut tidak valid. Perubahan kode berikut dalam metode Create (dalam file App_Start\IdentityConfig.cs) mengatur token kedaluwarsa dalam 3 jam.

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

Dengan kode di atas, kata sandi yang terlupakan dan token konfirmasi email akan kedaluwarsa dalam 3 jam. Pengaturan awal TokenLifespan adalah satu hari.

Kode berikut menunjukkan metode konfirmasi email:

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

Untuk membuat aplikasi Anda lebih aman, ASP.NET Identity mendukung autentikasi Two-Factor (2FA). Lihat ASP.NET Identity 2.0: Menyiapkan Validasi Akun dan Otorisasi Two-Factor oleh John Atten. Meskipun Anda dapat mengatur penguncian akun pada kegagalan upaya kata sandi masuk, pendekatan tersebut membuat login Anda rentan terhadap penguncian DOS. Kami merekomendasikan Anda menggunakan penguncian akun hanya dengan otentikasi dua faktor.

Sumber daya tambahan