Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 
SMSoptionsklasse gemaakt in hetServices/SMSoptions.csbestand. 
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.csbestand 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
 
              
              
            
- Tik op uw gebruikersnaam, waarmee de 
Indexactiemethode in De controller beheren wordt geactiveerd. Tik vervolgens op het telefoonnummer Koppeling toevoegen . 
              
              
            
- Voeg een telefoonnummer toe dat de verificatiecode ontvangt en tik op Verificatiecode verzenden.
 
              
              
            
- U ontvangt een sms-bericht met de verificatiecode. Voer deze in en tik op Verzenden
 
              
              
            
Als u geen sms-bericht krijgt, raadpleegt u de logboekpagina van twilio.
- In de weergave Beheren ziet u dat uw telefoonnummer is toegevoegd.
 
              
              
            
- Tik op Inschakelen om tweeledige verificatie in te schakelen.
 
              
              
            
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.
              
              
            
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.
              
              
            
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);