Bagikan melalui


Autentikasi dua faktor dengan SMS di ASP.NET Core

Oleh Rick Anderson dan Swiss-Devs

Peringatan

Dua aplikasi pengautentikasi autentikasi faktor (2FA), menggunakan Algoritma Kata Sandi Satu Kali Berbasis Waktu (TOTP), adalah pendekatan yang direkomendasikan industri untuk 2FA. 2FA menggunakan TOTP lebih disukai daripada SMS 2FA. Untuk informasi selengkapnya, lihat Mengaktifkan pembuatan Kode QR untuk aplikasi pengautentikasi TOTP di ASP.NET Core untuk ASP.NET Core 2.0 dan yang lebih baru.

Tutorial ini menunjukkan cara menyiapkan autentikasi dua faktor (2FA) menggunakan SMS. Instruksi diberikan untuk twilio dan ASPSMS, tetapi Anda dapat menggunakan penyedia SMS lainnya. Kami sarankan Anda menyelesaikan Konfirmasi Akun dan Pemulihan Kata Sandi sebelum memulai tutorial ini.

Melihat atau mengunduh kode sampel. Cara mengunduh.

Membuat proyek ASP.NET Core baru

Buat aplikasi web ASP.NET Core baru bernama Web2FA dengan akun pengguna individual. Ikuti instruksi di Terapkan HTTPS di ASP.NET Core untuk menyiapkan dan memerlukan HTTPS.

Membuat akun SMS

Buat akun SMS, misalnya, dari twilio atau ASPSMS. Rekam kredensial autentikasi (untuk twilio: accountSid dan authToken, untuk ASPSMS: Userkey dan Password).

Mencari tahu kredensial Penyedia SMS

Twilio:

Dari tab Dasbor akun Twilio Anda, salin SID Akun dan token Auth.

ASPSMS:

Dari pengaturan akun Anda, navigasikan ke Userkey dan salin bersama dengan Kata Sandi Anda.

Kami nantinya akan menyimpan nilai-nilai ini dengan alat secret-manager dalam kunci SMSAccountIdentification dan SMSAccountPassword.

Menentukan SenderID / Originator

Twilio: Dari tab Nomor, salin nomor telepon Twilio Anda.

ASPSMS: Dalam Menu Unlock Originators, buka kunci satu atau beberapa Originator atau pilih Originator alfanumerik (Tidak didukung oleh semua jaringan).

Kami nantinya akan menyimpan nilai ini dengan alat secret-manager dalam kunci SMSAccountFrom.

Berikan kredensial untuk layanan SMS

Kami akan menggunakan pola Opsi untuk mengakses akun pengguna dan pengaturan kunci.

  • Buat kelas untuk mengambil kunci SMS aman. Untuk sampel ini, SMSoptions kelas dibuat dalam Services/SMSoptions.cs file.
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

Atur SMSAccountIdentification, SMSAccountPassword dan SMSAccountFrom dengan alat secret-manager. Contohnya:

C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
  • Tambahkan paket NuGet untuk penyedia SMS. Dari Package Manager Console (PMC) jalankan:

Twilio:

Install-Package Twilio

ASPSMS:

Install-Package ASPSMS

  • Tambahkan kode dalam Services/MessageServices.cs file untuk mengaktifkan SMS. Gunakan Twilio atau bagian ASPSMS:

Twilio:

using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

namespace Web2FA.Services
{
    // This class is used by the application to send Email and SMS
    // when you turn on two-factor authentication in ASP.NET Identity.
    // For more details see this link https://go.microsoft.com/fwlink/?LinkID=532713
    public class AuthMessageSender : IEmailSender, ISmsSender
    {
        public AuthMessageSender(IOptions<SMSoptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public SMSoptions Options { get; }  // set only via Secret Manager

        public Task SendEmailAsync(string email, string subject, string message)
        {
            // Plug in your email service here to send an email.
            return Task.FromResult(0);
        }

        public Task SendSmsAsync(string number, string message)
        {
            // Plug in your SMS service here to send a text message.
            // Your Account SID from twilio.com/console
            var accountSid = Options.SMSAccountIdentification;
            // Your Auth Token from twilio.com/console
            var authToken = Options.SMSAccountPassword;

            TwilioClient.Init(accountSid, authToken);

            return MessageResource.CreateAsync(
              to: new PhoneNumber(number),
              from: new PhoneNumber(Options.SMSAccountFrom),
              body: message);
        }
    }
}

ASPSMS:

using Microsoft.Extensions.Options;
using System.Threading.Tasks;

namespace Web2FA.Services
{
    // This class is used by the application to send Email and SMS
    // when you turn on two-factor authentication in ASP.NET Identity.
    // For more details see this link https://go.microsoft.com/fwlink/?LinkID=532713
    public class AuthMessageSender : IEmailSender, ISmsSender
    {
        public AuthMessageSender(IOptions<SMSoptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public SMSoptions Options { get; }  // set only via Secret Manager

        public Task SendEmailAsync(string email, string subject, string message)
        {
            // Plug in your email service here to send an email.
            return Task.FromResult(0);
        }

        public Task SendSmsAsync(string number, string message)
        {
            ASPSMS.SMS SMSSender = new ASPSMS.SMS();

            SMSSender.Userkey = Options.SMSAccountIdentification;
            SMSSender.Password = Options.SMSAccountPassword;
            SMSSender.Originator = Options.SMSAccountFrom;

            SMSSender.AddRecipient(number);
            SMSSender.MessageData = message;

            SMSSender.SendTextSMS();

            return Task.FromResult(0);
        }
    }
}

Mengonfigurasi startup untuk digunakan SMSoptions

Tambahkan SMSoptions ke kontainer layanan dalam ConfigureServices metode di Startup.cs:

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
    services.Configure<SMSoptions>(Configuration);
}

Mengaktifkan autentikasi dua faktor

Views/Manage/Index.cshtmlRazor Buka file tampilan dan hapus karakter komentar (sehingga tidak ada markup yang dikomentari).

Masuk dengan autentikasi dua faktor

  • Jalankan aplikasi dan daftarkan pengguna baru

Web application Register view open in Microsoft Edge

  • Ketuk nama pengguna Anda, yang mengaktifkan Index metode tindakan di Kelola pengontrol. Lalu ketuk tautan Tambahkan nomor telepon.

Manage view - tap the

  • Tambahkan nomor telepon yang akan menerima kode verifikasi, dan ketuk Kirim kode verifikasi.

Add Phone Number page

  • Anda akan mendapatkan pesan teks dengan kode verifikasi. Masukkan dan ketuk Kirim

Verify Phone Number page

Jika Anda tidak mendapatkan pesan teks, lihat halaman log twilio.

  • Tampilan Kelola memperlihatkan nomor telepon Anda berhasil ditambahkan.

Manage view - phone number added successfully

  • Ketuk Aktifkan untuk mengaktifkan autentikasi dua faktor.

Manage view - enable two-factor authentication

Menguji autentikasi dua faktor

  • Log-keluar.

  • Masuk.

  • Akun pengguna telah mengaktifkan autentikasi dua faktor, jadi Anda harus memberikan faktor autentikasi kedua. Dalam tutorial ini Anda telah mengaktifkan verifikasi telepon. Templat bawaan juga memungkinkan Anda menyiapkan email sebagai faktor kedua. Anda dapat menyiapkan faktor kedua tambahan untuk autentikasi seperti kode QR. Ketuk Kirim.

Send Verification Code view

  • Masukkan kode yang Anda dapatkan di pesan SMS.

  • Mengklik kotak centang Ingat browser ini akan membebaskan Anda dari kebutuhan untuk menggunakan 2FA untuk masuk saat menggunakan perangkat dan browser yang sama. Mengaktifkan 2FA dan mengklik Ingat browser ini akan memberi Anda perlindungan 2FA yang kuat dari pengguna berbahaya yang mencoba mengakses akun Anda, selama mereka tidak memiliki akses ke perangkat Anda. Anda dapat melakukan ini pada perangkat privat apa pun yang Anda gunakan secara teratur. Dengan mengatur Ingat browser ini, Anda mendapatkan keamanan tambahan 2FA dari perangkat yang tidak Anda gunakan secara teratur, dan Anda mendapatkan kenyamanan untuk tidak harus melalui 2FA di perangkat Anda sendiri.

Verify view

Penguncian akun untuk melindungi dari serangan brute force

Penguncian akun direkomendasikan dengan 2FA. Setelah pengguna masuk melalui akun lokal atau akun sosial, setiap upaya yang gagal di 2FA disimpan. Jika upaya akses maksimum yang gagal tercapai, pengguna dikunci (default: Penguncian 5 menit setelah 5 upaya akses gagal). Autentikasi yang berhasil mengatur ulang jumlah upaya akses yang gagal dan mengatur ulang jam. Upaya akses maksimum yang gagal dan waktu penguncian dapat diatur dengan MaxFailedAccessAttempts dan DefaultLockoutTimeSpan. Berikut ini mengonfigurasi penguncian akun selama 10 menit setelah 10 upaya akses gagal:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    services.Configure<IdentityOptions>(options =>
    {
        options.Lockout.MaxFailedAccessAttempts = 10;
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
    });

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
    services.Configure<SMSoptions>(Configuration);
}

Konfirmasikan bahwa PasswordSignInAsync diatur lockoutOnFailure ke true:

var result = await _signInManager.PasswordSignInAsync(
                 Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);