次の方法で共有


ASP.NET Core での SMS による 2 要素認証

Rick AndersonSwiss-Devs

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を使用して、SMSAccountPasswordSMSAccountFromを設定します。 例えば次が挙げられます。

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

SMSoptionsConfigureServices メソッドのサービス コンテナーにStartup.csを追加します。

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

2 要素認証を有効にする

Views/Manage/Index.cshtml Razor ビュー ファイルを開き、コメント文字を削除します (コメント アウトされるマークアップはありません)。

2 要素認証を使用してログインする

  • アプリを実行して新しいユーザーを登録する

Microsoft Edge で開いている Web アプリケーションの [登録] ビュー

  • ユーザー名をタップすると、[コントローラーの管理] で Index アクション メソッドがアクティブになります。 次に、電話番号の [追加] リンクを タップします。

ビューの管理 - [追加] リンクをタップする

  • 確認コードを受け取る電話番号を追加し、[ 確認コードの送信] をタップします。

[電話番号の追加] ページ

  • 確認コードを含むテキスト メッセージが表示されます。 入力して[送信]をタップします

[電話番号の確認] ページ

テキスト メッセージが表示されない場合は、twilio ログ ページを参照してください。

  • [管理] ビューには、電話番号が正常に追加されたことが表示されます。

ビューの管理 - 電話番号が正常に追加されました

  • [ 有効にする] をタップして、2 要素認証を有効にします。

ビューの管理 - 2 要素認証を有効にする

2 要素認証をテストする

  • ログアウトする。

  • ログイン。

  • ユーザー アカウントで 2 要素認証が有効になっているため、認証の 2 番目の要素を指定する必要があります。 このチュートリアルでは、電話認証を有効にしました。 組み込みのテンプレートを使用すると、2 番目の要素として電子メールを設定することもできます。 QR コードなどの認証用の追加の 2 番目の要素を設定できます。 [送信] をタップします。

[確認コードの送信] ビュー

  • SMS メッセージに取得するコードを入力します。

  • [ このブラウザーを記憶 する] チェックボックスをクリックすると、同じデバイスとブラウザーを使用する場合に 2FA を使用してログオンする必要が除外されます。 2FAを有効にして[ このブラウザを記憶 する]をクリックすると、デバイスにアクセスできない限り、アカウントにアクセスしようとしている悪意のあるユーザーからの強力な2FA保護が提供されます。 これは、定期的に使用するすべてのプライベート デバイスで実行できます。 [このブラウザーを記憶する] を設定すると、定期的に使用しないデバイスから 2FA のセキュリティが強化され、自分のデバイスで 2FA を経由する必要がないという利便性が得られます。

ビューの確認

ブルート フォース攻撃から保護するためのアカウント ロックアウト

アカウント ロックアウトは 2FA で推奨されます。 ユーザーがローカル アカウントまたはソーシャル アカウントを使用してサインインすると、2FA で失敗した各試行が格納されます。 失敗したアクセス試行の最大数に達すると、ユーザーはロックアウトされます (既定: 5 回のアクセス試行の失敗後、5 分間のロックアウト)。 認証が成功すると、失敗したアクセス試行回数がリセットされ、クロックがリセットされます。 失敗したアクセス試行の最大数とロックアウト時間は、 MaxFailedAccessAttemptsDefaultLockoutTimeSpanで設定できます。 次の例では、アクセス試行が 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 lockoutOnFailuretrueに設定されていることを確認します。

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