Zweistufige Authentifizierung mit SMS in ASP.NET Core

Von Rick Anderson und Swiss-Devs

Warnung

Zwei Faktorauthentifizierungs-Apps (2FA) authenticator-Apps, die einen Zeitbasierten Kennwortalgorithmus (TOTP) verwenden, sind der industrie empfohlene Ansatz für 2FA. 2FA-Verwendung von TOTP wird für SMS 2FA bevorzugt. Weitere Informationen finden Sie unter Aktivieren der QR-Code-Generation für TOTP-Authentifizierungs-Apps in ASP.NET Core für ASP.NET Core 2.0 und höher.

In diesem Lernprogramm wird gezeigt, wie Sie die zweistufige Authentifizierung (2FA) mithilfe von SMS einrichten. Anweisungen für twilio und ASPSMS, aber Sie können jeden anderen SMS-Anbieter verwenden. Es wird empfohlen, die Kontobestätigung und die Kennwortwiederherstellung abzuschließen, bevor Sie dieses Lernprogramm starten.

Anzeigen oder Herunterladen von Beispielcode So laden Sie sie herunter.

Erstellen eines neuen ASP.NET Core-Projekts

Erstellen Sie eine neue ASP.NET Core Web-App mit dem Namen Web2FA einzelner Benutzerkonten. Folgen Sie den Anweisungen in "HTTPS erzwingen" in ASP.NET Core, um HTTPS einzurichten und zu benötigen.

Erstellen eines SMS-Kontos

Erstellen Sie ein SMS-Konto, z. B. von twilio oder ASPSMS. Aufzeichnen der Authentifizierungsanmeldeinformationen (für twilio: accountSid und authToken, für ASPSMS: Userkey and Password).

Ermitteln der SMS-Anbieteranmeldeinformationen

Twilio:

Kopieren Sie auf der Registerkarte "Dashboard" Ihres Twilio-Kontos das Konto-SID - und Auth-Token.

ASPSMS:

Navigieren Sie in Ihren Kontoeinstellungen zu Userkey , und kopieren Sie sie zusammen mit Ihrem Kennwort.

Später speichern wir diese Werte im Geheim-Manager-Tool innerhalb der Schlüssel SMSAccountIdentification und SMSAccountPassword.

Angeben von SenderID / Originor

Twilio: Kopieren Sie auf der Registerkarte "Zahlen" Ihre Twilio-Telefonnummer.

ASPSMS: Entsperren Sie im Menü "Originatoren entsperren" einen oder mehrere Originatoren oder wählen Sie einen alphanumerischen Ursprung (nicht von allen Netzwerken unterstützt) aus.

Wir speichern diesen Wert später mit dem Geheim-Manager-Tool innerhalb des Schlüssels SMSAccountFrom.

Bereitstellen von Anmeldeinformationen für den SMS-Dienst

Wir verwenden das Optionsmuster , um auf das Benutzerkonto und die Schlüsseleinstellungen zuzugreifen.

  • Erstellen Sie eine Klasse, um den sicheren SMS-Schlüssel abzurufen. Für dieses Beispiel wird die SMSoptions Klasse in der Services/SMSoptions.cs Datei erstellt.
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

Legen Sie das SMSAccountIdentificationSMSAccountPassword Tool für geheimen Manager fest.SMSAccountFrom Beispiel:

C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
  • Fügen Sie das NuGet Paket für den SMS-Anbieter hinzu. Führen Sie aus der Paket-Manager Konsole (PMC) folgendes aus:

Twilio:

Install-Package Twilio

ASPSMS:

Install-Package ASPSMS

  • Fügen Sie code in der Services/MessageServices.cs Datei hinzu, um SMS zu aktivieren. Verwenden Sie entweder den Abschnitt "Twilio" oder "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);
        }
    }
}

Konfigurieren des Startvorgangs für die Verwendung SMSoptions

Fügen Sie SMSoptions dem Dienstcontainer in der Methode in der Startup.csConfigureServices Methode hinzu:

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

Aktivieren Sie die zweistufige Authentifizierung.

Öffnen Sie die Views/Manage/Index.cshtmlRazor Ansichtsdatei, und entfernen Sie die Kommentarzeichen (daher wird kein Markup auskommentiert).

Melden Sie sich mit zweistufiger Authentifizierung an

  • Führen Sie die App aus, und registrieren Sie einen neuen Benutzer

Web application Register view open in Microsoft Edge

  • Tippen Sie auf Ihren Benutzernamen, der die Index Aktionsmethode im Manage Controller aktiviert. Tippen Sie dann auf die Telefonnummer "Link hinzufügen ".

Manage view - tap the

  • Fügen Sie eine Telefonnummer hinzu, die den Überprüfungscode empfängt, und tippen Sie auf " Bestätigungscode senden".

Add Phone Number page

  • Sie erhalten eine Textnachricht mit dem Überprüfungscode. Geben Sie ihn ein, und tippen Sie auf "Senden".

Verify Phone Number page

Wenn Sie keine Textnachricht erhalten, sehen Sie sich die Seite "twilio log" an.

  • Die Ansicht "Verwalten" zeigt, dass Ihre Telefonnummer erfolgreich hinzugefügt wurde.

Manage view - phone number added successfully

  • Tippen Sie auf "Aktivieren ", um die zweistufige Authentifizierung zu aktivieren.

Manage view - enable two-factor authentication

Testen der zweistufigen Authentifizierung

  • Melden Sie sich ab.

  • Melden Sie sich an.

  • Das Benutzerkonto hat die zweistufige Authentifizierung aktiviert, sodass Sie den zweiten Faktor der Authentifizierung bereitstellen müssen. In diesem Lernprogramm haben Sie die Überprüfung des Telefons aktiviert. Mit den integrierten Vorlagen können Sie auch E-Mails als zweiten Faktor einrichten. Sie können zusätzliche zweite Faktoren für die Authentifizierung wie QR-Codes einrichten. Tippen Sie auf "Übermitteln".

Send Verification Code view

  • Geben Sie den Code ein, den Sie in der SMS-Nachricht erhalten.

  • Wenn Sie auf das Kontrollkästchen " Browser speichern" klicken, werden Sie davon ausgenommen, dass Sie 2FA verwenden müssen, um sich anzumelden, wenn Sie dasselbe Gerät und denselben Browser verwenden. Wenn Sie 2FA aktivieren und auf diesen Browser klicken, erhalten Sie einen starken 2FA-Schutz vor böswilligen Benutzern, die versuchen, auf Ihr Konto zuzugreifen, solange sie keinen Zugriff auf Ihr Gerät haben. Sie können dies auf jedem privaten Gerät tun, das Sie regelmäßig verwenden. Indem Sie diesen Browser festlegen, erhalten Sie die hinzugefügte Sicherheit von 2FA auf Geräten, die Sie nicht regelmäßig verwenden, und Sie erhalten die Bequemlichkeit, nicht über 2FA auf ihren eigenen Geräten zu gehen.

Verify view

Kontosperrung zum Schutz vor Brute-Force-Angriffen

Die Kontosperrung wird mit 2FA empfohlen. Sobald sich ein Benutzer über ein lokales Konto oder ein soziales Konto anmeldet, wird jeder fehlgeschlagene Versuch bei 2FA gespeichert. Wenn die maximal fehlgeschlagenen Zugriffsversuche erreicht werden, wird der Benutzer gesperrt (Standard: 5 Minuten Sperrung nach 5 fehlgeschlagenen Zugriffsversuchen). Eine erfolgreiche Authentifizierung setzt die Anzahl der fehlgeschlagenen Zugriffsversuche zurück und setzt die Uhr zurück. Die maximale Fehlgeschlagene Zugriffsversuche und Sperrzeit können mit MaxFailedAccessAttempts und DefaultLockoutTimeSpanfestgelegt werden. Im Folgenden wird die Kontosperrung für 10 Minuten konfiguriert, nachdem 10 fehlgeschlagene Zugriffsversuche aufgetreten sind:

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

Vergewissern Sie sich, dass sie PasswordSignInAsynclockoutOnFailure auf true:

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