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 SMSAccountPassword
iç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 SMSAccountFrom
secret-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şturulurServices/SMSoptions.cs
.
namespace Web2FA.Services
{
public class SMSoptions
{
public string SMSAccountIdentification { get; set; }
public string SMSAccountPassword { get; set; }
public string SMSAccountFrom { get; set; }
}
}
SMSAccountIdentification
SMSAccountPassword
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.cs
ekleyinSMSoptions
:
// 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.cshtml
Razor 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
- 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.
- Doğrulama kodunu alacak bir telefon numarası ekleyin ve Doğrulama kodu gönder'e dokunun.
- Doğrulama kodunu içeren bir kısa mesaj alırsınız. Girin ve Gönder'e dokunun
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.
- İki öğeli kimlik doğrulamasını etkinleştirmek için Etkinleştir'e dokunun.
İ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.
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.
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
true
onaylayın:
var result = await _signInManager.PasswordSignInAsync(
Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
ASP.NET Core