Zweistufige Authentifizierung mit SMS in ASP.net CoreTwo-factor authentication with SMS in ASP.NET Core

Von Rick Anderson und Schweizer-EntwicklerBy Rick Anderson and Swiss-Devs

Warnung

Authentifikator-apps mit zweistufiger Authentifizierung (Two-Factor Authentication, 2FA). dabei handelt es sich um einen zeitbasierten einmaligen Kenn Wort Algorithmus (TOTP), der von der Branche empfohlen wird.Two factor authentication (2FA) authenticator apps, using a Time-based One-time Password Algorithm (TOTP), are the industry recommended approach for 2FA. die 2FA-Verwendung von TOTP wird für SMS 2FA bevorzugt.2FA using TOTP is preferred to SMS 2FA. Weitere Informationen finden Sie unter Aktivieren der QR-Code Generierung für TOTP Authenticator-apps in ASP.net Core für ASP.net Core 2,0 und höher.For more information, see Enable QR Code generation for TOTP authenticator apps in ASP.NET Core for ASP.NET Core 2.0 and later.

In diesem Tutorial wird gezeigt, wie Sie die zweistufige Authentifizierung (2FA) mithilfe von SMS einrichten.This tutorial shows how to set up two-factor authentication (2FA) using SMS. Für twilio und ASPSMSwerden Anweisungen erteilt, aber Sie können auch einen beliebigen anderen SMS-Anbieter verwenden.Instructions are given for twilio and ASPSMS, but you can use any other SMS provider. Bevor Sie mit diesem Tutorial beginnen, wird empfohlen, die Konto Bestätigung und Kenn Wort Wiederherstellung abzuschließen.We recommend you complete Account Confirmation and Password Recovery before starting this tutorial.

Anzeigen oder Herunterladen von BeispielcodeView or download sample code. Herunterladen vonHow to download.

Erstellen eines neuen ASP.NET Core-ProjektsCreate a new ASP.NET Core project

Erstellen Sie eine neue ASP.net Core Web- Web2FA App mit dem Namen mit einzelnen Benutzerkonten.Create a new ASP.NET Core web app named Web2FA with individual user accounts. Befolgen Sie die Anweisungen Erzwingen von HTTPS in ASP.net Core unter, um HTTPS einzurichten und anzufordern.Follow the instructions in Erzwingen von HTTPS in ASP.net Core to set up and require HTTPS.

Erstellen eines SMS-KontosCreate an SMS account

Erstellen Sie ein SMS-Konto, z. b. aus twilio oder ASPSMS.Create an SMS account, for example, from twilio or ASPSMS. Notieren Sie die Anmelde Informationen für die Authentifizierung (für twilio: AccountSid und AuthToken für aspsms: UserKey und Password).Record the authentication credentials (for twilio: accountSid and authToken, for ASPSMS: Userkey and Password).

Ermitteln der Anmelde Informationen für den SMS-AnbieterFiguring out SMS Provider credentials

TwilioTwilio:

Kopieren Sie die Konto-SID und das Authentifizierungs Tokenauf der Registerkarte Dashboard Ihres twilio-Kontos.From the Dashboard tab of your Twilio account, copy the Account SID and Auth token.

Aspsms:ASPSMS:

Navigieren Sie in Ihren Kontoeinstellungen zu UserKey , und kopieren Sie es mit Ihrem Kennwort.From your account settings, navigate to Userkey and copy it together with your Password.

Diese Werte werden später in mit dem Secret-Manager-Tool in den Schlüsseln SMSAccountIdentification und SMSAccountPasswordgespeichert.We will later store these values in with the secret-manager tool within the keys SMSAccountIdentification and SMSAccountPassword.

Angeben von SenderID/AbsenderSpecifying SenderID / Originator

Twilio: Kopieren Sie Ihre twilio- Telefonnummerauf der Registerkarte Zahlen.Twilio: From the Numbers tab, copy your Twilio phone number.

Aspsms: Entsperren Sie einen oder mehrere Originatoren im Menü Unlock-Absender, oder wählen Sie einen alphanumerischen Absender aus (wird nicht von allen Netzwerken unterstützt).ASPSMS: Within the Unlock Originators Menu, unlock one or more Originators or choose an alphanumeric Originator (Not supported by all networks).

Dieser Wert wird später mit dem Secret-Manager-Tool im Schlüssel SMSAccountFromgespeichert.We will later store this value with the secret-manager tool within the key SMSAccountFrom.

Angeben von Anmelde Informationen für den SMS-DienstProvide credentials for the SMS service

Wir verwenden das options Muster für den Zugriff auf das Benutzerkonto und die Schlüssel Einstellungen.We'll use the Options pattern to access the user account and key settings.

  • Erstellen Sie eine Klasse, um den sicheren SMS-Schlüssel abzurufen.Create a class to fetch the secure SMS key. In diesem Beispiel wird die SMSoptions -Klasse in der Datei Services/smsoptions. cs erstellt.For this sample, the SMSoptions class is created in the Services/SMSoptions.cs file.
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

SMSAccountIdentificationLegen Sie SMSAccountPassword und SMSAccountFrom mit dem Secret-Manager-Toolfest.Set the SMSAccountIdentification, SMSAccountPassword and SMSAccountFrom with the secret-manager tool. Beispiel:For example:

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.Add the NuGet package for the SMS provider. Führen Sie in der Paket-Manager-Konsole (PMC) Folgendes aus:From the Package Manager Console (PMC) run:

TwilioTwilio:

Install-Package Twilio

Aspsms:ASPSMS:

Install-Package ASPSMS

  • Fügen Sie Code in der Datei " Services/messageservices. cs " hinzu, um SMS zu aktivieren.Add code in the Services/MessageServices.cs file to enable SMS. Verwenden Sie entweder den twilio-oder den ASPSMS-Abschnitt:Use either the Twilio or the ASPSMS section:

TwilioTwilio:

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

Zu verwendenden Start konfigurierenSMSoptionsConfigure startup to use SMSoptions

Fügen SMSoptions Sie dem Dienst Container in der ConfigureServices -Methode in der Startup.cshinzu:Add SMSoptions to the service container in the ConfigureServices method in the Startup.cs:

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

Aktivieren Sie die zweistufige Authentifizierung.Enable two-factor authentication

Öffnen Sie die Ansichts Datei views/Manage/Index. cshtml Razor , und entfernen Sie die Kommentarzeichen (sodass kein Markup auskommentiert ist).Open the Views/Manage/Index.cshtml Razor view file and remove the comment characters (so no markup is commented out).

Anmelden mit zweistufiger AuthentifizierungLog in with two-factor authentication

  • Ausführen der APP und Registrieren eines neuen BenutzersRun the app and register a new user

Ansicht "Webanwendungs Register" in Microsoft Edge geöffnet

  • Tippen Sie auf Ihren Benutzernamen, der die Index Aktionsmethode in Manage Controller aktiviert.Tap on your user name, which activates the Index action method in Manage controller. Tippen Sie dann auf den Link Telefonnummer Hinzufügen .Then tap the phone number Add link.

Ansicht verwalten: Tippen Sie auf den Link "hinzufügen".

  • Fügen Sie eine Telefonnummer hinzu, die den Überprüfungs Code empfängt, und tippen Sie auf Überprüfungs Code senden.Add a phone number that will receive the verification code, and tap Send verification code.

Seite "Telefonnummer hinzufügen"

  • Sie erhalten eine Textnachricht mit dem Überprüfungs Code.You will get a text message with the verification code. EINGABETASTE SubmitEnter it and tap Submit

Seite "Telefonnummer überprüfen"

Wenn Sie keine SMS erhalten, finden Sie weitere Informationen auf der twilio-Protokoll Seite.If you don't get a text message, see twilio log page.

  • In der Ansicht verwalten wird angezeigt, dass Ihre Telefonnummer erfolgreich hinzugefügt wurde.The Manage view shows your phone number was added successfully.

Ansicht verwalten-die Telefonnummer wurde erfolgreich hinzugefügt.

  • Tippen Sie auf aktivieren , um die zweistufige Authentifizierung zu aktivieren.Tap Enable to enable two-factor authentication.

Ansicht verwalten: Aktivieren der zweistufigen Authentifizierung

Testen der zweistufigen AuthentifizierungTest two-factor authentication

  • Melden Sie sich ab.Log off.

  • Melden Sie sich an.Log in.

  • Das Benutzerkonto hat die zweistufige Authentifizierung aktiviert, sodass Sie den zweiten Authentifizierungs Faktor bereitstellen müssen.The user account has enabled two-factor authentication, so you have to provide the second factor of authentication . In diesem Tutorial haben Sie die Telefon Überprüfung aktiviert.In this tutorial you have enabled phone verification. Die integrierten Vorlagen ermöglichen Ihnen auch das Einrichten von e-Mails als zweiten Faktor.The built in templates also allow you to set up email as the second factor. Sie können weitere zweite Faktoren für die Authentifizierung einrichten, z. b. QR-Codes.You can set up additional second factors for authentication such as QR codes. Tippen Sie auf senden.Tap Submit.

Überprüfungs Code Ansicht senden

  • Geben Sie den Code ein, den Sie in der SMS-Nachricht erhalten.Enter the code you get in the SMS message.

  • Wenn Sie auf das Kontrollkästchen diesen Browser speichern klicken, werden Sie von der Verwendung von 2FA zum Anmelden aufgefordert, wenn Sie das gleiche Gerät und den gleichen Browser verwenden.Clicking on the Remember this browser check box will exempt you from needing to use 2FA to log on when using the same device and browser. Durch das Aktivieren von 2FA und das Klicken auf Speichern dieses Browsers 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.Enabling 2FA and clicking on Remember this browser will provide you with strong 2FA protection from malicious users trying to access your account, as long as they don't have access to your device. Hierfür können Sie ein beliebiges privates Gerät verwenden, das Sie regelmäßig verwenden.You can do this on any private device you regularly use. Wenn Sie diesen Browser merken, erhalten Sie die zusätzliche Sicherheit von 2FA von Geräten, die Sie nicht regelmäßig verwenden, und Sie erhalten die Möglichkeit, die 2FA nicht auf Ihren eigenen Geräten zu durchlaufen.By setting Remember this browser, you get the added security of 2FA from devices you don't regularly use, and you get the convenience on not having to go through 2FA on your own devices.

Ansicht überprüfen

Konto Sperre zum Schutz vor Brute-Force-AngriffenAccount lockout for protecting against brute force attacks

Die Kontosperrung wird mit 2FA empfohlen.Account lockout is recommended with 2FA. Sobald sich ein Benutzer über ein lokales Konto oder ein Social Media-Konto anmeldet, wird jeder fehlgeschlagene Versuch bei "2FA" gespeichert.Once a user signs in through a local account or social account, each failed attempt at 2FA is stored. Wenn die maximale Anzahl fehlerhafter Zugriffsversuche erreicht ist, wird der Benutzer gesperrt (Standard: 5 Minuten Sperre nach fünf fehlgeschlagenen Zugriffsversuchen).If the maximum failed access attempts is reached, the user is locked out (default: 5 minute lockout after 5 failed access attempts). Bei erfolgreicher Authentifizierung wird die Anzahl fehlerhafter Zugriffsversuche zurückgesetzt, und die Uhr wird zurückgesetzt.A successful authentication resets the failed access attempts count and resets the clock. Die maximalen fehlgeschlagenen Zugriffsversuche und Sperr Zeit können mit " maxfailedaccessversuchs " und " defaultlockouttimespan" festgelegt werden.The maximum failed access attempts and lockout time can be set with MaxFailedAccessAttempts and DefaultLockoutTimeSpan. Nachfolgend wird die Kontosperrung 10 Minuten nach 10 fehlgeschlagenen Zugriffsversuchen konfiguriert:The following configures account lockout for 10 minutes after 10 failed access attempts:

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 passwordsigninasync auf lockoutOnFailure truefestgelegt ist:Confirm that PasswordSignInAsync sets lockoutOnFailure to true:

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