Freigeben über


Zweistufige Authentifizierung mit SMS in ASP.NET Core

Von Rick Anderson und Swiss-Devs

Warnung

Zweistufige Authentifizierungs-Apps (2FA) mit einem zeitbasierten Einmalkennwortalgorithmus (TOTP) sind der branchenspezifische Ansatz für 2FA. 2FA mit TOTP wird gegenüber SMS 2FA bevorzugt. Weitere Informationen finden Sie unter Aktivieren der QR-Code-Generierung für TOTP-Authentifikator-Apps in ASP.NET Core für ASP.NET Core 2.0 oder höher.

In diesem Lernprogramm wird gezeigt, wie Sie die zweistufige Authentifizierung (2FA) mithilfe von SMS einrichten. Es liegen Anweisungen vor für twilio und ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/), aber Sie können auch 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 Herunterladen.

Erstellen eines neuen ASP.NET Core-Projekts

Erstellen Sie eine neue ASP.NET Core-Web-App mit individuellen Konten namens Web2FA. Befolgen Sie die Anweisungen unter Erzwingen von HTTPS in ASP.NET Core , um HTTPS einzurichten und zu erfordern.

Erstellen eines SMS-Kontos

Erstellen Sie ein SMS-Konto, z. B. von twilio oder ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/). Notieren Sie die Authentifizierungsanmeldeinformationen (für twilio: accountSid und authToken, für ASPSMS: Userkey und Password).

Ermitteln der Anmeldeinformationen des SMS-Anbieters

Twilio:

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

ASPSMS:

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

Diese Werte werden später mit dem Tool Secret-Manager unter den Schlüsseln SMSAccountIdentification und SMSAccountPassword gespeichert.

Angeben der SenderID/Absender

Twilio: Kopieren Sie die Twilio-Telefonnummer aus dem Tab "Nummern".

ASPSMS: Im Menü "Zum Entsperren von Absendern" entsperren Sie einen oder mehrere Absender oder wählen Sie einen alphanumerischen Absender aus (wird nicht von allen Netzwerken unterstützt).

Später werden wir diesen Wert mit dem Tool für den geheimen Manager im Schlüssel SMSAccountFromspeichern.

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 zum Abrufen des sicheren SMS-Schlüssels. 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 SMSAccountIdentification, SMSAccountPassword und SMSAccountFrom mit dem Secret-Manager-Tool fest. 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 in 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);
        }
    }
}

Startvorgang konfigurieren, um SMSoptions zu verwenden

Fügen Sie SMSoptions dem Dienstcontainer in der ConfigureServices-Methode in Startup.cs hinzu.

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

Aktivieren der zweistufigen Authentifizierung

Öffnen Sie die Views/Manage/Index.cshtmlRazor-Ansichtsdatei, und entfernen Sie die Kommentarzeichen, sodass kein Markup auskommentiert ist.

Anmelden mit zweistufiger Authentifizierung

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

In Microsoft Edge geöffnete Webanwendungsregisteransicht

  • Tippen Sie auf Ihren Benutzernamen, wodurch die Index Aktionsmethode im Controller verwalten aktiviert wird. Tippen Sie dann auf den Link hinzufügen bei der Telefonnummer.

Ansicht verwalten – Tippen Sie auf den Link

  • Fügen Sie eine Telefonnummer hinzu, die den Überprüfungscode erhält, und tippen Sie auf "Überprüfungscode senden".

Seite

  • Sie erhalten eine Sms mit dem Überprüfungscode. Geben Sie sie ein, und tippen Sie auf 'Absenden'.

Seite

Wenn Sie keine Sms erhalten, wird die Seite "twilio log" angezeigt.

  • In der Ansicht "Verwalten" wird angezeigt, dass Ihre Telefonnummer erfolgreich hinzugefügt wurde.

Ansicht verwalten – Telefonnummer erfolgreich hinzugefügt

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

Ansicht verwalten – Aktivieren der zweistufigen Authentifizierung

Testen der zweistufigen Authentifizierung

  • Ausloggen.

  • Anmelden.

  • Das Benutzerkonto hat die zweistufige Authentifizierung aktiviert, sodass Sie den zweiten Authentifizierungsfaktor bereitstellen müssen. In diesem Lernprogramm haben Sie die Telefonüberprüfung 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 Senden.

Überprüfungscode-Ansicht senden

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

  • Wenn Sie auf das Kontrollkästchen " Diesen Browser speichern " klicken, müssen Sie sich nicht mit 2FA anmelden, wenn Sie dasselbe Gerät und denselben Browser verwenden. Wenn Sie 2FA aktivieren und auf " Diesen Browser speichern" klicken, erhalten Sie starken 2FA-Schutz vor böswilligen Benutzern, die versuchen, auf Ihr Konto zuzugreifen, sofern sie keinen Zugriff auf Ihr Gerät haben. Sie können diese Einstellung auf jedem privaten Gerät vornehmen, das Sie regelmäßig verwenden. Wenn Sie die Einstellung Diesen Browser merken aktivieren, profitieren Sie von der zusätzlichen Sicherheit durch Zwei-Faktor-Authentifizierung auf Geräten, die Sie nicht regelmäßig verwenden, und genießen die Bequemlichkeit, auf Ihren eigenen Geräten keine Zwei-Faktor-Authentifizierung durchführen zu müssen.

Überprüfen der Ansicht

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 sind, 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 maximalen fehlgeschlagenen Zugriffsversuche und die Sperrzeit können mit MaxFailedAccessAttempts und DefaultLockoutTimeSpan festgelegt werden. Im Folgenden wird die Kontosperre für 10 Minuten nach 10 fehlgeschlagenen Zugriffsversuchen konfiguriert:

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

Bestätigen Sie, dass PasswordSignInAsynclockoutOnFailure auf true setzt:

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