Sdílet prostřednictvím


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

Od Rick Anderson a Swiss-Devs

Varování

Dvoufaktorové autentizační aplikace (2FA) používající algoritmus jednorázového hesla založeného na čase (TOTP) jsou doporučovaným přístupem pro 2FA. 2FA využívající TOTP je preferováno před 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 nebo 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 (https://www.aspsms.com/asp.net/identity/core/testcredits/), 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.

Zobrazit nebo stáhnout vzorový kód. Jak stáhnout.

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

Vytvořte novou webovou aplikaci ASP.NET Core pojmenovanou Web2FA s jednotlivými účty. Postupujte podle pokynů v Vynucení HTTPS v ASP.NET Core pro nastavení a požadavkování HTTPS.

Vytvoření účtu SMS

Vytvořte účet SMS, například z twilio nebo ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/). 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 záložce Řídicí panel ve vašem účtu Twilio zkopírujte ID účtu SID a ověřovací token .

ASPSMS:

V nastavení účtu přejděte na uživatelský klíč a zkopírujte jej 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 své Twilio telefonní číslo.

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 rámci klíče SMSAccountFrom.

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

K přístupu k uživatelskému účtu a klíčovým nastavením použijeme vzorec Možnosti.

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

Nastavte SMSAccountIdentification, SMSAccountPassword a SMSAccountFrom pomocí nástroje secret-manager. Napří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 souboru Services/MessageServices.cs kód, který povolí SMS. Použijte buď sekci 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);
        }
    }
}

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

Do kontejneru služby v metodě SMSoptions v ConfigureServicespřidejte Startup.cs:

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

Povolení dvoufaktorového ověřování

Otevřete soubor zobrazení Views/Manage/Index.cshtmlRazor a odeberte znaky komentáře (tak, aby žádná část značkování nebyla komentována).

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

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

Pohled registrace webové aplikace otevřený v Microsoft Edge

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

Spravovat zobrazení – klepněte na odkaz Přidat

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

Přidat stránku telefonního čísla

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

stránka pro ověření telefonního čísla

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.

Spravovat zobrazení – telefonní číslo bylo úspěšně přidáno

  • Klepnutím na Povolit aktivujte dvoufaktorové ověřování.

Správa zobrazení – povolení dvoufaktorového ověřování

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

  • Odhlaste se.

  • Přihlásit 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. Můžete nastavit další faktory pro ověřování, jako jsou kódy QR. Klepněte na Odeslat.

odeslat zobrazení ověřovacího kódu

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

  • Klikněte na zaškrtávací políčko Pamatovat si tento prohlížeč, čímž se osvobodíte od potřeby použít dvoufázové ověření (2FA) při přihlašování na stejném zařízení a prohlížeči. Povolení 2FA a kliknutí na Pamatovat si tento prohlížeč vám poskytne silnou ochranu 2FA před škodlivými uživateli, kteří se pokoušejí 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 lepší zabezpečení pomocí 2FA na zařízeních, která nepoužíváte pravidelně, a pohodlí spočívající v tom, že na vlastních zařízeních nemusíte 2FA procházet.

Ověření zobrazení

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

Ověřte, že PasswordSignInAsync nastaví lockoutOnFailure na true:

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