Aracılığıyla paylaş


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 veya ü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 ()https://www.aspsms.com/asp.net/identity/core/testcredits/ için yönergeler verilir, 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 hesaplarla 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 (https://www.aspsms.com/asp.net/identity/core/testcredits/) 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 SMSAccountPassword içindeki secret-manager aracı ile depolayacağız.

SenderID / Gönderici 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 SMSAccountFrom anahtarıyla secret-manager aracı kullanarak 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 SMSoptions sınıfı Services/SMSoptions.cs dosyasında oluşturulmuştur.
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

SMSAccountIdentification, SMSAccountPassword ve SMSAccountFrom değerlerini gizli yöneticisi aracı ile ayarlayın. Örneğin:

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şlangıcı kullanacak şekilde yapılandırın SMSoptions

SMSoptions yönteminde ConfigureServices hizmet kapsayıcısına ekleyin Startup.cs.

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

İki öğeli kimlik doğrulamasını etkinleştirme

Views/Manage/Index.cshtml Razor Görünüm dosyasını açın ve açıklama karakterlerini kaldırın (böylece işaretleme açıklama olarak işaretlenmez).

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

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

Web uygulamasının Kayıt görünümü Microsoft Edge'de açık

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

Görünümü yönet -

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

Telefon Numarası Ekle sayfası

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

Telefon Numarasını Doğrulama sayfası

Kısa mesaj alamazsanız, Twilio kayıt sayfasına bakın.

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

Görünümü yönet - telefon numarası başarıyla eklendi

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

Görünümü yönetme - iki öğeli kimlik doğrulamasını etkinleştirme

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

  • Oturumu kapatın.

  • Oturum aç.

  • 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.

Doğrulama Kodu Gönder görünümü

  • 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.

Görünümü doğrulama

Kaba kuvvet saldırılarına karşı koruma için hesap kilitlemesi

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. MaxFailedAccessAttempts ve DefaultLockoutTimeSpan ile en 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);
}

PasswordSignInAsync lockoutOnFailure öğesini true olarak ayarladığını onaylayın.

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