ASP.NET Core で TOTP 認証アプリ用の QR コードを生成できるようにする
ASP.NET Core には、個々の認証に対し認証アプリケーションのサポートが標準装備されています。 タイムベースのワンタイム パスワード アルゴリズム (TOTP) を使用する 2 要素認証 (2FA) 認証アプリは、業界で 2FA において推奨されるアプローチです。 TOTP を使用する 2FA は SMS 2FA より推奨されています。 認証アプリにより、ユーザー名とパスワードをユーザーが確認した後に入力する 6 から 8 桁のコードが提供されます。 通常、認証アプリはスマートフォンにインストールされています。
警告
ASP.NET Core TOTP コードは、有効期限が切れる前に複数回正常に認証するために使用できるため、シークレットを保持する必要があります。
ASP.NET Core Web アプリ テンプレートでは認証システムはサポートしていますが、QR コードの生成はサポートしていません。 QR コード ジェネレーターを使用すると、2FA を簡単に設定できるようになります。 このドキュメントでは、Razor Pages と MVC アプリ向けに、2FA 構成ページに QR コードの生成を追加する方法について説明します。 Blazor Web App に適用されるガイダンスについては、「ASP.NET Core Blazor Web App で TOTP 認証アプリの QR コード生成を有効にする」をご覧ください。
ASP.NET Core Web アプリ テンプレートでは認証システムはサポートしていますが、QR コードの生成はサポートしていません。 QR コード ジェネレーターを使用すると、2FA を簡単に設定できるようになります。 このドキュメントでは、2FA の構成ページに QR コードの生成を追加する方法について説明します。
2 要素認証は、Google や Facebook などの外部認証プロバイダーを使用しては行われません。 外部ログインは、外部のログイン プロバイダーが提供するメカニズムによって保護されます。 たとえば、Microsoft 認証プロバイダーには、ハードウェア キーまたは別の 2FA アプローチが必要です。 既定のテンプレートで Web アプリと外部認証プロバイダーの両方に 2FA が必要な場合、ユーザーは 2 つの 2FA アプローチを満たす必要があります。 2 つの 2FA アプローチを必要とすることは、確立されたセキュリティ プラクティスとは異なります。これは通常、認証に 1 つの強力な 2FA メソッドに依存します。
2FA 構成ページへの QR コードの追加
これらの手順では、 qrcode.js
リポジトリの https://davidshimjs.github.io/qrcodejs/ を使用しています。
qrcode.js
JavaScript ライブラリをご自分のプロジェクトのwwwroot\lib
フォルダーにダウンロードします。- Identity のスキャフォールディングの指示に従って、
/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
を生成します。 /Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
で、ファイルの末尾にあるScripts
探します。
@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
}
qr.js
という新しい JavaScript ファイルをwwwroot/js
に作成し、次のコードを追加して QR コードを生成します。
window.addEventListener("load", () => {
const uri = document.getElementById("qrCodeData").getAttribute('data-url');
new QRCode(document.getElementById("qrCode"),
{
text: uri,
width: 150,
height: 150
});
});
Scripts
セクションを更新して、前にダウンロードしたqrcode.js
ライブラリへの参照を追加します。- QR コードを生成する呼び出しを含む
qr.js
ファイルを追加します。
@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
<script type="text/javascript" src="~/lib/qrcode.js"></script>
<script type="text/javascript" src="~/js/qr.js"></script>
}
- これらの手順にリンクされている段落を削除します。
アプリを実行し、QR コードをスキャンし、認証システムが証明するコードを検証できることを確認します。
QR コードのサイト名を変更する
QR コードのサイト名は、ご自分のプロジェクトを最初に作成したときに選択したプロジェクト名から取得されます。 これは、GenerateQrCodeUri(string email, string unformattedKey)
で /Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml.cs
メソッドを探すと変更できます。
テンプレートの既定のコードは次のようになります。
private string GenerateQrCodeUri(string email, string unformattedKey)
{
return string.Format(
AuthenticatorUriFormat,
_urlEncoder.Encode("Razor Pages"),
_urlEncoder.Encode(email),
unformattedKey);
}
string.Format
への呼び出しの 2 番目のパラメーターは、ご自分のソリューション名から取得したサイト名です。 これは任意の値に変更できますが、常にエンコードされた URL である必要があります。
別の QR コード ライブラリの使用
QR コード ライブラリは、お好みのライブラリに置き換えることができます。 HTML には、ご自分のライブラリが提供しているメカニズムを問わず QR コードを配置できる qrCode
要素があります。
正しい書式の QR コードの URL は、次にあります。
- モデルの
AuthenticatorUri
プロパティ。 data-url
要素のqrCodeData
プロパティ。
TOTP クライアントとサーバーの時間のずれ
TOTP (タイムベースのワンタイム パスワード) 認証は、サーバーと認証デバイスの両方の時間が正確であることに依存しています。 トークンは 30 秒間しか有効ではありません。 TOTP 2FA ログインが失敗する場合は、サーバーの時間が正確であり、できれば正確な NTP サービスに同期されていることを確認します。
ASP.NET Core