Dela via


Tvåfaktorsautentisering med SMS i ASP.NET Core

Av Rick Anderson och Swiss-Devs

Varning

Autentiseringsappar för tvåfaktorautentisering (2FA) med hjälp av en tidsbaserad engångslösenordalgoritm (TOTP) är den branschrekommenderade metoden för 2FA. 2FA med TOTP är att föredra framför SMS 2FA. Mer information finns i Aktivera QR Code-generering för TOTP-autentiseringsappar i ASP.NET Core för ASP.NET Core 2.0 och senare.

Den här guiden visar hur du konfigurerar tvåfaktorsautentisering (2FA) med SMS. Instruktioner ges för twilio och ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/), men du kan använda andra SMS-leverantörer. Vi rekommenderar att du slutför kontobekräftelse och återställning av lösenord innan du påbörjar den här självstudien.

Visa eller ladda ned exempelkod. Ladda ned.

Skapa ett nytt ASP.NET Core-projekt

Skapa en ny ASP.NET Core-webbapp med namnet Web2FA med enskilda användarkonton. Följ anvisningarna i Framtvinga HTTPS i ASP.NET Core för att konfigurera och kräva HTTPS.

Skapa ett SMS-konto

Skapa ett SMS-konto, till exempel från twilio eller ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/). Registrera autentiseringsuppgifterna (för twilio: accountSid och authToken, för ASPSMS: Userkey och Password).

Räkna ut autentiseringsuppgifter för SMS-provider

Twilio:

På fliken Dashboard för ditt Twilio-konto kopierar du Account SID och Auth token.

ASPSMS:

Från kontoinställningarna går du till Userkey- och kopierar den tillsammans med ditt Lösenord.

Vi kommer senare att lagra dessa värden i med verktyget secret-manager i nycklarna SMSAccountIdentification och SMSAccountPassword.

Ange SenderID/Originator

Twilio: Från fliken Nummer kopierar du Twilio-telefonnummer.

ASPSMS: I menyn Lås upp originatorer låser du upp en eller flera originatorer eller väljer en alfanumerisk originator (stöds inte av alla nätverk).

Vi kommer senare att lagra det här värdet med verktyget secret-manager i nyckeln SMSAccountFrom.

Ange autentiseringsuppgifter för SMS-tjänsten

Vi använder mönstret alternativ för att komma åt användarkontot och nyckelinställningarna.

  • Skapa en klass för att hämta den säkra SMS-nyckeln. I det här exemplet skapas klassen SMSoptions i filen Services/SMSoptions.cs.
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

Ange SMSAccountIdentification, SMSAccountPassword och SMSAccountFrom med verktyget secret-manager. Till exempel:

C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
  • Lägg till NuGet-paketet för SMS-providern. Från Package Manager-konsolen (PMC) kör du:

Twilio:

Install-Package Twilio

ASPSMS:

Install-Package ASPSMS

  • Lägg till kod i filen Services/MessageServices.cs för att aktivera SMS. Använd antingen avsnittet Twilio eller 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);
        }
    }
}

Konfigurera start för att använda SMSoptions

Lägg till SMSoptions i servicecontainern i metoden ConfigureServices i Startup.cs:

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

Aktivera tvåfaktorsautentisering

Öppna Views/Manage/Index.cshtmlRazor visningsfilen och ta bort kommentarstecken (så att ingen markering är kommenterad).

Logga in med tvåfaktorautentisering

  • Kör appen och registrera en ny användare

Registrera vy för webbapplikation öppnas i Microsoft Edge

  • Tryck på användarnamnet, som aktiverar Index-åtgärdsmetoden i Hantera kontrollant. Tryck sedan på telefonnumret Lägg till länken.

Hantera vy – tryck på länken

  • Lägg till ett telefonnummer som tar emot verifieringskoden och tryck på Skicka verifieringskod.

Lägg till telefonnummer-sidan

  • Du får ett sms med verifieringskoden. Ange det och tryck på Skicka

Verifiera telefonnummersidan

Om du inte får något textmeddelande kan du läsa loggsidan för twilio.

  • Vyn Hantera visar att ditt telefonnummer har lagts till.

Hantera vy – telefonnummer har lagts till framgångsrikt

  • Tryck på Aktivera för att aktivera tvåfaktorautentisering.

Hantera vy – aktivera tvåfaktorautentisering

Testa tvåfaktorautentisering

  • Logga ut.

  • Logga in.

  • Användarkontot har aktiverat tvåfaktorautentisering, så du måste ange den andra autentiseringsfaktorn. I den här handledningen har du aktiverat telefonverifiering. Med de inbyggda mallarna kan du också konfigurera e-post som den andra faktorn. Du kan konfigurera ytterligare andra faktorer för autentisering, till exempel QR-koder. Tryck på Skicka.

Skicka verifieringskod

  • Ange den kod som du får i SMS-meddelandet.

  • Om du klickar på kryssrutan Kom ihåg den här webbläsaren undantas du från att behöva använda 2FA för att logga in när du använder samma enhet och webbläsare. Om du aktiverar 2FA och klickar på Kom ihåg att den här webbläsaren ger dig starkt 2FA-skydd mot skadliga användare som försöker komma åt ditt konto, så länge de inte har åtkomst till din enhet. Du kan göra detta på alla privata enheter som du använder regelbundet. Genom att ange Kom ihåg den här webbläsarenfår du den extra säkerheten för 2FA från enheter som du inte använder regelbundet, och du får bekvämligheten med att inte behöva gå igenom 2FA på dina egna enheter.

Verifiera vyn

Kontoutelåsning för att skydda mot råstyrkeattacker

Kontoutelåsning rekommenderas med 2FA. När en användare loggar in via ett lokalt konto eller ett socialt konto lagras varje misslyckat försök till 2FA. Om det maximala antalet misslyckade åtkomstförsök nås är användaren utelåst (standard: 5 minuters utelåsning efter 5 misslyckade åtkomstförsök). En lyckad autentisering återställer antalet misslyckade åtkomstförsök och återställer klockan. Maximalt antal misslyckade åtkomstförsök och utelåsningstid kan anges med MaxFailedAccessAttempts och DefaultLockoutTimeSpan. Följande konfigurerar kontoutelåsning i 10 minuter efter 10 misslyckade åtkomstförsök:

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

Bekräfta att PasswordSignInAsync ställer in lockoutOnFailure till true:

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