Dvoufaktorové ověřování pomocí SMS v ASP.NET Core

Autor: Rick Anderson a Swiss-Devs

Upozorňující

Dvoufaktorové ověřování (2FA) ověřovací aplikace využívající jednorázový jednorázový algoritmus hesla (TOTP) založené na čase jsou doporučeným přístupem pro 2FA. 2FA využívající TOTP je upřednostňované pro SMS 2FA. Další informace najdete v tématu Povolení generování kódu QR pro ověřovací aplikace TOTP v ASP.NET Core pro ASP.NET Core 2.0 a novější.

V tomto kurzu se dozvíte, jak nastavit dvojúrovňové ověřování (2FA) pomocí SMS. Pokyny jsou uvedeny pro twilio a ASPSMS, ale můžete použít libovolného jiného poskytovatele serveru SMS. Před zahájením tohoto kurzu doporučujeme dokončit potvrzení účtu a obnovení hesla.

Zobrazení nebo stažení vzorového kódu Jak stáhnout.

Vytvoření nového projektu ASP.NET Core

Vytvořte novou webovou aplikaci ASP.NET Core pojmenovanou Web2FA s jednotlivými uživatelskými účty. Postupujte podle pokynů v části Vynucení HTTPS v ASP.NET Core a nastavte a vyžadovat HTTPS.

Vytvoření účtu SMS

Vytvořte účet SMS, například z twilia nebo ASPSMS. Poznamenejte si přihlašovací údaje pro ověřování (pro twilio: accountSid a authToken, pro ASPSMS: Userkey a Password).

Zjištění přihlašovacích údajů poskytovatele serveru SMS

Twilio:

Na kartě Řídicí panel vašeho účtu Twilio zkopírujte IDENTIFIKÁTOR SID účtu a ověřovací token.

ASPSMS:

V nastavení účtu přejděte na Uživatelský klíč a zkopírujte ho společně s heslem.

Později tyto hodnoty uložíme pomocí nástroje secret-manager v rámci klíčů SMSAccountIdentification a SMSAccountPassword.

Určení ID odesílatele / původce

Twilio: Na kartě Čísla zkopírujte svoje telefonní číslo Twilio.

ASPSMS: V nabídce Odemykání původců odemkněte jeden nebo více původců nebo zvolte alfanumerický původce (nepodporuje se ve všech sítích).

Později tuto hodnotu uložíme pomocí nástroje secret-manager v klíči SMSAccountFrom.

Zadání přihlašovacích údajů pro službu SMS

K přístupu k uživatelskému účtu a nastavení klíče použijeme vzor Možnosti.

  • Vytvořte třídu pro načtení zabezpečeného klíče SMS. Pro tuto ukázku se třída SMSoptions vytvoří v Services/SMSoptions.cs souboru.
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

Nastavte a SMSAccountPasswordSMSAccountIdentificationSMSAccountFrom použijte nástroj secret-manager. Příklad:

C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
  • Přidejte balíček NuGet pro poskytovatele serveru SMS. Z konzoly Správce balíčků (PMC) spusťte:

Twilio:

Install-Package Twilio

ASPSMS:

Install-Package ASPSMS

  • Přidejte do Services/MessageServices.cs souboru kód, který povolí SMS. Použijte část Twilio nebo 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);
        }
    }
}

Konfigurace spuštění pro použití SMSoptions

Přidejte SMSoptions do kontejneru služby v ConfigureServices metodě v :Startup.cs

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

Povolení dvouúrovňového ověřování

Views/Manage/Index.cshtmlRazor Otevřete soubor zobrazení a odeberte znaky komentáře (takže se neodkomentují žádné revize).

Přihlášení pomocí dvojúrovňového ověřování

  • Spuštění aplikace a registrace nového uživatele

Web application Register view open in Microsoft Edge

  • Klepněte na své uživatelské jméno, které aktivuje metodu Index akce v kontroleru Spravovat. Potom klepněte na odkaz Přidat telefonní číslo.

Manage view - tap the

  • Přidejte telefonní číslo, které obdrží ověřovací kód, a klepněte na Odeslat ověřovací kód.

Add Phone Number page

  • Zobrazí se textová zpráva s ověřovacím kódem. Zadejte ho a klepněte na Odeslat.

Verify Phone Number page

Pokud se vám nezobrazí textová zpráva, podívejte se na stránku protokolu twilio.

  • Zobrazení Spravovat ukazuje, že vaše telefonní číslo bylo úspěšně přidáno.

Manage view - phone number added successfully

  • Klepnutím na Povolit povolíte dvojúrovňové ověřování.

Manage view - enable two-factor authentication

Testování dvojúrovňového ověřování

  • Odhlaste se.

  • Přihlaste se.

  • Uživatelský účet povolil dvojúrovňové ověřování, takže musíte zadat druhý faktor ověřování. V tomto kurzu jste povolili ověření telefonu. Integrované šablony také umožňují nastavit e-mail jako druhý faktor. Pro ověřování, jako jsou kódy QR, můžete nastavit další další faktory. Klepněte na Odeslat.

Send Verification Code view

  • Zadejte kód, který dostanete ve zprávě SMS.

  • Když kliknete na zaškrtávací políčko Pamatovat si tento prohlížeč , nebudete muset použít 2FA pro přihlášení při použití stejného zařízení a prohlížeče. Povolení 2FA a kliknutí na Možnost Zapamatovat tento prohlížeč vám poskytne silnou ochranu 2FA před škodlivými uživateli, kteří se snaží získat přístup k vašemu účtu, pokud nemají přístup k vašemu zařízení. Můžete to udělat na jakémkoli privátním zařízení, které pravidelně používáte. Nastavením Pamatovat si tento prohlížeč získáte přidané zabezpečení 2FA ze zařízení, která pravidelně nepoužíváte, a získáte pohodlí, že nemusíte procházet 2FA na vlastních zařízeních.

Verify view

Uzamčení účtu pro ochranu před útoky hrubou silou

U 2FA se doporučuje uzamčení účtu. Jakmile se uživatel přihlásí přes místní účet nebo účet sociální sítě, uloží se každý neúspěšný pokus o 2FA. Pokud dojde k dosažení maximálního počtu neúspěšných pokusů o přístup, je uživatel uzamčen (výchozí hodnota: 5 minut uzamčení po 5 neúspěšných pokusech o přístup). Úspěšné ověření resetuje počet neúspěšných pokusů o přístup a resetuje hodiny. Maximální počet neúspěšných pokusů o přístup a časový limit uzamčení lze nastavit pomocí MaxFailedAccessAttempts a DefaultLockoutTimeSpan. Následující konfigurace uzamčení účtu po dobu 10 minut po 10 neúspěšných pokusech o přístup:

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

Potvrďte, že je PasswordSignInAsync nastavená lockoutOnFailure hodnota true:

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