ASP.NET Core'da SMS ile iki öğeli kimlik doğrulaması

Tarafından Rick Anderson ve Swiss-Devs

Uyarı

Zaman Tabanlı Tek Seferlik Parola Algoritması (TOTP) kullanan iki faktörlü kimlik doğrulaması (2FA) kimlik doğrulama uygulaması, 2FA için sektör tarafından önerilen yaklaşımdır. TOTP kullanan 2FA, SMS 2FA'ya tercih edilir. Daha fazla bilgi için bkz . ASP.NET Core 2.0 ve üzeri için ASP.NET Core'da TOTP kimlik doğrulayıcı uygulamaları için QR Kodu oluşturmayı etkinleştirme.

Bu öğreticide SMS kullanarak iki öğeli kimlik doğrulamasının (2FA) nasıl ayarlanacağı gösterilmektedir. Twilio ve ASPSMS için yönergeler verilmiştir, ancak başka herhangi bir SMS sağlayıcısını kullanabilirsiniz. Bu öğreticiye başlamadan önce Hesap Onayı ve Parola Kurtarma'yı tamamlamanızı öneririz.

Örnek kodu görüntüleyin veya indirme. nasıl indirilir?

Yeni ASP.NET Core projesi oluşturma

Tek tek kullanıcı hesaplarıyla adlı Web2FA yeni bir ASP.NET Core web uygulaması oluşturun. HTTPS'yi ayarlamak ve gerekli kılmak için ASP.NET Core'da HTTPS'yi zorunlu kılma başlığındaki yönergeleri izleyin.

SMS hesabı oluşturma

Örneğin, twilio veya ASPSMS'den bir SMS hesabı oluşturun. Kimlik doğrulama kimlik bilgilerini kaydedin (twilio için: accountSid ve authToken, ASPSMS için: Userkey ve Password).

SMS Sağlayıcısı kimlik bilgilerini çözme

Twilio:

Twilio hesabınızın Pano sekmesinden Hesap SID'sini ve Kimlik Doğrulama belirtecini kopyalayın.

ASPSMS:

Hesap ayarlarınızdan Userkey'e gidin ve Parolanızla birlikte kopyalayın.

Bu değerleri daha sonra anahtarlar SMSAccountIdentification ve SMSAccountPasswordiçindeki secret-manager aracıyla içinde depolayacağız.

SenderID / Gönderen Belirtme

Twilio: Numaralar sekmesinden Twilio telefon numaranızı kopyalayın.

ASPSMS: Başlatanların Kilidini Aç Menüsünde, bir veya daha fazla Kaynakçının kilidini açın veya alfasayısal bir KaynakLayıcı seçin (Tüm ağlar tarafından desteklenmez).

Bu değeri daha sonra anahtarındaki SMSAccountFromsecret-manager aracıyla depolayacağız.

SMS hizmeti için kimlik bilgilerini sağlama

Kullanıcı hesabına ve anahtar ayarlarına erişmek için Seçenekler desenini kullanacağız.

  • Güvenli SMS anahtarını getirmek için bir sınıf oluşturun. Bu örnek için sınıfı SMSoptions dosyasında oluşturulur Services/SMSoptions.cs .
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

SMSAccountIdentificationSMSAccountPassword gizli dizi yöneticisi aracıyla ve SMSAccountFrom değerini ayarlayın. Örnek:

C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
  • SMS sağlayıcısı için NuGet paketini ekleyin. Paket Yöneticisi Konsolu'ndan (PMC) komutunu çalıştırın:

Twilio:

Install-Package Twilio

ASPSMS:

Install-Package ASPSMS

  • SMS'i Services/MessageServices.cs etkinleştirmek için dosyaya kod ekleyin. Twilio veya ASPSMS bölümünü kullanın:

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

Başlatmayı kullanılacak şekilde yapılandırma SMSoptions

içindeki yönteminde hizmet kapsayıcısına ConfigureServices Startup.csekleyinSMSoptions:

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

İki faktörlü kimlik doğrulamasını etkinleştirme

Views/Manage/Index.cshtmlRazor Görünüm dosyasını açın ve açıklama karakterlerini kaldırın (böylece işaretleme açıklama satırı yapılmaz).

İki öğeli kimlik doğrulaması ile oturum açma

  • Uygulamayı çalıştırma ve yeni bir kullanıcı kaydetme

Web application Register view open in Microsoft Edge

  • Denetleyiciyi yönet bölümünde eylem yöntemini etkinleştiren Index kullanıcı adınıza dokunun. Ardından Bağlantı ekle telefon numarasına dokunun.

Manage view - tap the

  • Doğrulama kodunu alacak bir telefon numarası ekleyin ve Doğrulama kodu gönder'e dokunun.

Add Phone Number page

  • Doğrulama kodunu içeren bir kısa mesaj alırsınız. Girin ve Gönder'e dokunun

Verify Phone Number page

Kısa mesaj alamazsanız bkz. twilio günlük sayfası.

  • Yönet görünümü, telefon numaranızın başarıyla eklendiğini gösterir.

Manage view - phone number added successfully

  • İki öğeli kimlik doğrulamasını etkinleştirmek için Etkinleştir'e dokunun.

Manage view - enable two-factor authentication

İki öğeli kimlik doğrulamasını test edin

  • Oturumu kapatın.

  • Oturum açın.

  • Kullanıcı hesabı iki öğeli kimlik doğrulamasını etkinleştirdiği için ikinci kimlik doğrulama faktörünü sağlamanız gerekir. Bu öğreticide telefon doğrulamayı etkinleştirdiniz. Yerleşik şablonlar, ikinci faktör olarak e-postayı ayarlamanıza da olanak sağlar. QR kodları gibi kimlik doğrulaması için ek ikinci faktörler ayarlayabilirsiniz. Gönder'e dokunun.

Send Verification Code view

  • SMS iletisinde size gelen kodu girin.

  • Bu tarayıcıyı anımsa onay kutusuna tıkladığınızda, aynı cihaz ve tarayıcıyı kullanırken oturum açmak için 2FA kullanmanız gerekmeyecektir. 2FA'yı etkinleştirmek ve Bu tarayıcıyı anımsa seçeneğine tıklamak, cihazınıza erişimi olmadığı sürece hesabınıza erişmeye çalışan kötü amaçlı kullanıcılara karşı güçlü 2FA koruması sağlar. Bunu düzenli olarak kullandığınız herhangi bir özel cihazda yapabilirsiniz. Bu tarayıcıyı anımsa ayarıyla, düzenli olarak kullanmadığınız cihazlardan 2FA'nın ek güvenliğini elde edersiniz ve kendi cihazlarınızda 2FA'dan geçmeme konusunda kolaylık elde edersiniz.

Verify view

Deneme yanılma saldırılarına karşı koruma için hesap kilitleme

2FA ile hesap kilitleme önerilir. Bir kullanıcı yerel bir hesap veya sosyal hesap aracılığıyla oturum açtığında, 2FA'daki başarısız girişimlerin her biri depolanır. En fazla başarısız erişim denemesine ulaşılırsa, kullanıcı kilitlenir (varsayılan: 5 başarısız erişim girişiminden sonra 5 dakikalık kilitleme). Başarılı bir kimlik doğrulaması başarısız olan erişim denemelerinin sayısını sıfırlar ve saati sıfırlar. Ve ile MaxFailedAccessAttempts DefaultLockoutTimeSpanen fazla başarısız erişim denemesi ve kilitleme süresi ayarlanabilir. Aşağıda, 10 başarısız erişim girişiminden sonra 10 dakika boyunca hesap kilitleme yapılandırılır:

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

olarak ayarlandığını PasswordSignInAsync lockoutOnFailure trueonaylayın:

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