【初心者向け】ASP.NET Core IdentityとSendGridを使用したメールベースの2要素認証

オウルです。

前回の【初心者向け】ASP.NET Core Identity – 構成編でIdentityの構成をしたので、今回はSendGridを使用したメールベースの2要素認証を紹介します。

ローカル環境
WSL v1 Ubuntu18.04 LTS
App ASP.NET Core 3.1.302
DB SQLServer Express 2017

スキャフォールディング

Identity Razorクラスライブラリの規定動作を変更する場合は、スキャフォールディングで生成したコードを変更します。VS Codeを使用する場合は、.NET Core CLIでプロジェクトにパッケージをインストールします。では、パッケージインストールをします。

パッケージインストール

依存関係があるため、適切なバージョンをインストールします。

dotnet aspnet-codegeneratorコマンド

スキャフォールディングでコード(ファイル)を生成します。次のコマンドで、どのコード(ファイル)を生成するか一覧で確認できます。

ファイル一覧

動作を変更したいファイルを追加

認証までの流れ

ユーザは、次のオペレーションを行い2要素認証をすることとします。

  • ユーザ作成
  • 本人確認メール送信
  • 本人確認(メールアドレス確認)
  • パスワード認証
  • 2要素認証

ユーザ作成

ここからは、スキャフォールディングで生成したコード(ファイル)を参考に重要だと思われる箇所を抜粋していきます。

最初にユーザを作成します。コード(ファイル)は”Register.cshtml”と”Register.cshtml.cs”です。

Register.cshtml.cs

次のコードは、ユーザ作成フォームをPOSTした時の処理です。

UserManager

突如、登場したUserManagerですが、AddDefaultIdentityで構成している場合は、AddDefaultIdentityservices.AddIdentityCoreでサービス登録されています。

また、AddIdentityで構成している場合は、AddIdentityでサービス登録されています。

トークンを生成

ユーザ作成後に入力したメールアドレスにメール送信します。次のコードは、そのメールの本文にあるリンクに埋め込むセキュリティで保護された確認トークンを生成しています。

トークンの有効期限は既定で1日ですが、すべてのデータ保護トークンのlifespansを変更することもできます。

また、電子メールトークンの有効期間を変更するなど、個別の変更も可能です。

本人確認メール送信

メール送信には、SendGridを使用します。SendGridを使用したメール送信の実装は、SendGrid C#ライブラリを参照ください。

SendGridでメール送信

SendGridはメール配信サービスです。AzureからSendGridリソースとして作成することもできます。SendGrid を使用した Azure での電子メールの送信方法にもあるように、Azureユーザーは、1 か月あたり 25,000 通の電子メールを無料で利用できます。但し、Pro 以下のプランは共有IPを使用することになるので、ご注意ください。ある日突然、Spamhausのブラックリストに登録されてメールが受信できないなんてこともあり得ます。

本人確認(メールアドレス確認)

次のコードは、受信したメールのリンクをクリックした時に実行されます。

トークンの検証に問題がなければ、[データベース].[AspNetUsers].[EmailConfirmed]カラムの値が1(bit)になり、メールアドレス確認済(本人確認済)ステータスとなります。

ログイン

ユーザ作成、メールアドレス確認が完了しましたので、次はパスワード認証(ログイン)です。パスワード認証のコード(ファイル)は”Login.cshtml”と”Login.cshtml.cs”になります。

パスワード認証

次のコードは、ログインフォームをPOSTした時の処理です。

Login.cshtml.cs

SignInManager

SignInManagerはAddDefaultUIでサービス登録されています。

2要素認証

いよいよ2要素認証です。コード(ファイル)は”LoginWith2fa.cshtml”と”LoginWith2fa.cshtml.cs”です。

LoginWith2fa.cshtml.cs

2要素認証

以上が、Identity ASP.NET CoreとSendGridを使用したメールベースの2要素認証の基本的なところになります。ASP.NET Core Identityのフレームワークは機能も豊富、且つカスタマイズも可能です。もちろん、 Facebook、Google、Microsoft アカウント、Twitterなどの外部ログインプロバイダーもサポートされています。かなりボリューム満点で、尻込み気味になりますが、これからも色々試していきたいものです。

また、APIではJWTトークン認証という選択もあります。興味がある方は、こちらも参考にしていただければと思います。

「【初心者向け】ASP.NET Core Identity」シリーズ
  1. ASP.NET Core Identity の2要素認証と Identity を使わない Cookie 認証 – 概要編
  2. ASP.NET Core Identity 構成編
  3. ASP.NET Core IdentityとSendGridを使用したメールベースの2要素認証
「【初心者向け】JWTトークン」シリーズ
  1. JWTトークンを使用してASP.NET Core APIをセキュアにする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA