Delen via


Tweeledige verificatie met SMS in ASP.NET Core

Door Rick Anderson en Swiss-Devs

Warning

Twee-factor-authenticatie (2FA) verificatietoepassingen, gebruik makend van een tijd-gebaseerd eenmalig wachtwoord-algoritme (TOTP), zijn de door de industrie aanbevolen benadering voor 2FA. 2FA die TOTP gebruikt, heeft de voorkeur voor SMS 2FA. Zie Qr-code genereren inschakelen voor TOTP Authenticator-apps in ASP.NET Core voor ASP.NET Core 2.0 of hoger voor meer informatie.

Deze zelfstudie laat zien hoe u tweeledige verificatie (2FA) instelt met sms. Er worden instructies gegeven voor twilio en ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/), maar u kunt elke andere SMS-provider gebruiken. U wordt aangeraden accountbevestiging en wachtwoordherstel te voltooien voordat u aan deze zelfstudie begint.

voorbeeldcode weergeven of downloaden. Downloaden.

Een nieuw ASP.NET Core-project maken

Maak een nieuwe ASP.NET Core webapp genaamd Web2FA met individuele accounts. Volg de instructies in Enforce HTTPS in ASP.NET Core om HTTPS op te zetten en af te dwingen.

Een SMS-account maken

Maak bijvoorbeeld een SMS-account van twilio of ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/). Noteer de verificatiereferenties (voor twilio: accountSid en authToken, voor ASPSMS: Userkey en Password).

Sms-providerreferenties achterhalen

Twilio:

Kopieer op het tabblad Dashboard van uw Twilio-account de account-SID en het verificatietoken.

ASPSMS:

Navigeer vanuit uw accountinstellingen naar Userkey en kopieer deze samen met uw wachtwoord.

Deze waarden worden later opgeslagen met het hulpprogramma secret-manager in de sleutels SMSAccountIdentification en SMSAccountPassword.

SenderID/Originator opgeven

Twilio: Kopieer uw Twilio-telefoonnummer op het tabblad Nummers.

ASPSMS: In het menu Originators ontgrendelen kun je een of meer originators ontgrendelen of een alfanumerieke originator kiezen (niet ondersteund door alle netwerken).

Deze waarde wordt later opgeslagen met het hulpprogramma secret-manager in de sleutel SMSAccountFrom.

Referenties opgeven voor de SMS-service

We gebruiken het patroon Opties voor toegang tot het gebruikersaccount en de sleutelinstellingen.

  • Maak een klasse om de beveiligde SMS-sleutel op te halen. Voor dit voorbeeld wordt de SMSoptions klasse gemaakt in het Services/SMSoptions.cs bestand.
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

Stel de SMSAccountIdentification, SMSAccountPassword en SMSAccountFrom in met het hulpprogramma secret-manager. Voorbeeld:

C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
  • Voeg het NuGet-pakket voor de SMS-provider toe. Voer vanuit de Package Manager Console (PMC) de volgende opdracht uit:

Twilio:

Install-Package Twilio

ASPSMS:

Install-Package ASPSMS

  • Voeg code toe aan het Services/MessageServices.cs bestand om sms in te schakelen. Gebruik de Twilio-sectie of de ASPSMS-sectie:

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

Configureren van opstarten met SMSoptions

Toevoegen SMSoptions aan de servicecontainer in de ConfigureServices methode in het volgende Startup.cs:

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

Tweeledige verificatie inschakelen

Open het Views/Manage/Index.cshtmlRazor weergavebestand en verwijder de commentaartekens (zodat geen markup is uitgecommentarieerd).

Aanmelden met tweeledige verificatie

  • De app uitvoeren en een nieuwe gebruiker registreren

De weergave Register van webtoepassingen is geopend in Microsoft Edge

  • Tik op uw gebruikersnaam, waarmee de Index actiemethode in De controller beheren wordt geactiveerd. Tik vervolgens op het telefoonnummer Koppeling toevoegen .

Weergave beheren - tik op de koppeling Toevoegen

  • Voeg een telefoonnummer toe dat de verificatiecode ontvangt en tik op Verificatiecode verzenden.

Pagina Telefoonnummer toevoegen

  • U ontvangt een sms-bericht met de verificatiecode. Voer deze in en tik op Verzenden

Telefoonnummer verifiëren pagina

Als u geen sms-bericht krijgt, raadpleegt u de logboekpagina van twilio.

  • In de weergave Beheren ziet u dat uw telefoonnummer is toegevoegd.

Weergave beheren - telefoonnummer toegevoegd

  • Tik op Inschakelen om tweeledige verificatie in te schakelen.

Weergave beheren - tweeledige verificatie inschakelen

Tweeledige verificatie testen

  • Afmelden.

  • Aanmelden.

  • Het gebruikersaccount heeft tweeledige verificatie ingeschakeld, dus u moet de tweede verificatiefactor opgeven. In deze handleiding hebt u telefoonverificatie ingeschakeld. Met de ingebouwde sjablonen kunt u ook e-mail instellen als de tweede factor. U kunt aanvullende tweede factoren instellen voor verificatie, zoals QR-codes. Tik op Verzenden.

Verificatiecode verzenden scherm

  • Voer de code in die u in het sms-bericht ontvangt.

  • Als u op het selectievakje Deze browser onthouden klikt, hoeft u geen 2FA te gebruiken om u aan te melden wanneer u hetzelfde apparaat en dezelfde browser gebruikt. Als u 2FA inschakelt en op Deze browser onthouden klikt, beschikt u over sterke 2FA-beveiliging tegen kwaadwillende gebruikers die proberen toegang te krijgen tot uw account, zolang ze geen toegang hebben tot uw apparaat. U kunt dit doen op elk privéapparaat dat u regelmatig gebruikt. Door deze browser in te stellen, krijgt u de extra beveiliging van 2FA van apparaten die u niet regelmatig gebruikt en krijgt u het gemak dat u niet 2FA op uw eigen apparaten hoeft te doorlopen.

Weergave controleren

Accountvergrendeling voor bescherming tegen beveiligingsaanvallen

Accountvergrendeling wordt aanbevolen met 2FA. Zodra een gebruiker zich aanmeldt via een lokaal account of sociaal account, wordt elke mislukte poging om 2FA opgeslagen. Als het maximum aantal mislukte toegangspogingen is bereikt, wordt de gebruiker vergrendeld (standaard: 5 minuten vergrendeling na 5 mislukte toegangspogingen). Een geslaagde verificatie stelt het aantal mislukte toegangspogingen opnieuw in en stelt de klok opnieuw in. De maximale mislukte toegangspogingen en vergrendelingstijd kunnen worden ingesteld met MaxFailedAccessAttempts en DefaultLockoutTimeSpan. Het volgende configureert accountvergrendeling 10 minuten na 10 mislukte toegangspogingen:

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

Bevestig dat PasswordSignInAsynclockoutOnFailure instelt op true:

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