Warnung
2FA には、時間ベースのワンタイム パスワード アルゴリズム (TOTP) を使用する 2 要素認証 (2FA) 認証アプリが推奨されます。 SMS 2FA には、TOTP を使用した 2FA が推奨されます。 詳細については、「ASP.NET Core 2.0 以降 の ASP.NET Core で TOTP 認証アプリの QR コード生成を有効にする 」を参照してください。
このチュートリアルでは、SMS を使用して 2 要素認証 (2FA) を設定する方法について説明します。
twilio と ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/
) に関する手順が示されていますが、他の SMS プロバイダーを使用できます。 このチュートリアルを開始する前に 、アカウントの確認とパスワードの回復 を完了することをお勧めします。
サンプル コードを表示またはダウンロードします。 ダウンロードする方法。
新しい ASP.NET Core プロジェクトを作成する
個々のアカウントで Web2FA
という名前の新しい ASP.NET Core Web アプリを作成します。
「ASP.NET Core で HTTPS を強制する」の手順に従って、HTTPS を設定して要求します。
SMS アカウントを作成する
たとえば、twilio または ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/
) から SMS アカウントを作成します。 認証資格情報を記録します (twilio: accountSid と authToken、ASPSMS の場合: ユーザーキーとパスワード)。
SMS プロバイダーの資格情報の把握
Twilio:
Twilio アカウントの [ダッシュボード] タブで、 アカウント SID と 認証トークンをコピーします。
ASPSMS:
アカウント設定からユーザーキーに移動し、それとパスワードを共にコピーします。
これらの値は、後でシークレット マネージャー ツールを使用して、 SMSAccountIdentification
キーと SMSAccountPassword
内に格納します。
SenderID/Originator の指定
Twilio: [番号] タブで、Twilio の電話番号をコピーします。
ASPSMS: [発信者のロック解除]メニューで、1 つ以上の発信元のロックを解除するか、英数字の発信元を選択します (すべてのネットワークではサポートされていません)。
この値は、後でシークレット マネージャー ツールと共にキー SMSAccountFrom
内に格納します。
SMS サービスの資格情報を指定する
オプション パターンを使用して、ユーザー アカウントとキーの設定にアクセスします。
- セキュリティ保護されたSMSキーを取得するクラスを作成します。 このサンプルでは、
SMSoptions
ファイルにServices/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
、SMSAccountFrom
、を設定します。 例えば次が挙げられます。
C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
- SMS プロバイダーの NuGet パッケージを追加します。 パッケージ マネージャー コンソール (PMC) から次のコマンドを実行します。
Twilio:
Install-Package Twilio
ASPSMS:
Install-Package ASPSMS
- SMS を有効にするには、
Services/MessageServices.cs
ファイルにコードを追加します。 Twilio または 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);
}
}
}
使用するようにスタートアップを構成する SMSoptions
SMSoptions
の ConfigureServices
メソッドのサービス コンテナーにStartup.cs
を追加します。
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
services.Configure<SMSoptions>(Configuration);
}
2 要素認証を有効にする
Views/Manage/Index.cshtml
Razor ビュー ファイルを開き、コメント文字を削除します (コメント アウトされるマークアップはありません)。
2 要素認証を使用してログインする
- アプリを実行して新しいユーザーを登録する
- ユーザー名をタップすると、[コントローラーの管理] で
Index
アクション メソッドがアクティブになります。 次に、電話番号の [追加] リンクを タップします。
- 確認コードを受け取る電話番号を追加し、[ 確認コードの送信] をタップします。
- 確認コードを含むテキスト メッセージが表示されます。 入力して[送信]をタップします
テキスト メッセージが表示されない場合は、twilio ログ ページを参照してください。
- [管理] ビューには、電話番号が正常に追加されたことが表示されます。
- [ 有効にする] をタップして、2 要素認証を有効にします。
2 要素認証をテストする
ログアウトする。
ログイン。
ユーザー アカウントで 2 要素認証が有効になっているため、認証の 2 番目の要素を指定する必要があります。 このチュートリアルでは、電話認証を有効にしました。 組み込みのテンプレートを使用すると、2 番目の要素として電子メールを設定することもできます。 QR コードなどの認証用の追加の 2 番目の要素を設定できます。 [送信] をタップします。
SMS メッセージに取得するコードを入力します。
[ このブラウザーを記憶 する] チェックボックスをクリックすると、同じデバイスとブラウザーを使用する場合に 2FA を使用してログオンする必要が除外されます。 2FAを有効にして[ このブラウザを記憶 する]をクリックすると、デバイスにアクセスできない限り、アカウントにアクセスしようとしている悪意のあるユーザーからの強力な2FA保護が提供されます。 これは、定期的に使用するすべてのプライベート デバイスで実行できます。 [このブラウザーを記憶する] を設定すると、定期的に使用しないデバイスから 2FA のセキュリティが強化され、自分のデバイスで 2FA を経由する必要がないという利便性が得られます。
ブルート フォース攻撃から保護するためのアカウント ロックアウト
アカウント ロックアウトは 2FA で推奨されます。 ユーザーがローカル アカウントまたはソーシャル アカウントを使用してサインインすると、2FA で失敗した各試行が格納されます。 失敗したアクセス試行の最大数に達すると、ユーザーはロックアウトされます (既定: 5 回のアクセス試行の失敗後、5 分間のロックアウト)。 認証が成功すると、失敗したアクセス試行回数がリセットされ、クロックがリセットされます。 失敗したアクセス試行の最大数とロックアウト時間は、 MaxFailedAccessAttempts と DefaultLockoutTimeSpanで設定できます。 次の例では、アクセス試行が 10 回失敗した後、アカウント ロックアウトを 10 分間構成します。
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
がtrue
に設定されていることを確認します。
var result = await _signInManager.PasswordSignInAsync(
Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
ASP.NET Core