次の方法で共有


ASP.NET Core Blazor Web Appにパスキーを実装する

このガイドでは、ASP.NET Core を使用して、新規または既存のBlazor Web AppのIdentityを実装する方法について説明します。

パスキーの概要と一般的な構成ガイダンスについては、「 Web 認証 API (WebAuthn) パスキーを有効にする」を参照してください。

[前提条件]

.NET SDK (.NET 10 以降)

認証要求の処理に使用する Blazor Web App

パスキーのサポートを含む、ASP.NET Core Blazor Web Appを使用して新しいIdentityを作成するには、次のガイダンスを使用します。

Visual Studio 2022 以降と .NET 10 以降の SDK が必要です。

Visual Studio:

  • [スタート] ウィンドウから [新しいプロジェクトの作成] を選択するか、メニュー バーから [ファイル]>[新規]>[プロジェクト] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、プロジェクト テンプレートのリストから [Blazor Web App] を選択します。 [ 次へ ] ボタンを選択します。
  • [新しいプロジェクトの構成] ダイアログで、BlazorWebAppPasskeys フィールでプロジェクトに「」という名前を付けます (大文字化は一致させます)。 この正確なプロジェクト名を使用することは、記事からビルドしているアプリにコピーするコードに名前空間が一致することを確認するために重要です。
  • アプリの [場所] が適切であることを確認します。 [ソリューションとプロジェクトを同じディレクトリに配置する] チェック ボックスはオンのままにします。 [ 次へ ] ボタンを選択します。
  • [ 追加情報 ] ダイアログで、[認証の 種類 ] を [個々のアカウント] に設定します。 その他のオプションには、次の設定を使用します。
    • フレームワーク: 最新のフレームワーク リリース (.NET 10 以降)
    • HTTPS 用の構成: 選択されている (有効)
    • 対話型レンダリング モード: サーバー
    • 対話機能の場所: グローバル
    • サンプル ページを含める: 選択されている (有効)
    • 最上位レベルのステートメントを使用しない: 選択しない
    • アプリケーション URL で .dev.localhost TLD を使用する: 選択されていません
    • を選択してを作成します。

前の手順では、次の Blazor Web App を作成します。

  • ASP.NET Core Identity-au|--authentication オプションを使用してユーザー認証用構成されます。
  • データ ストレージ用の SQLite を使用した Entity Framework Core。
  • パスキー登録と認証エンドポイント。
  • パスキーを管理するための UI コンポーネント。

現時点では、 Blazor Web App プロジェクト テンプレートにのみ組み込みのパスキー サポートが含まれています。

アプリケーションを実行する

F5 押してデバッグを使用してアプリを実行するか、Ctrl キー + をしてデバッグなしでアプリを実行します。

次のガイダンスは、アプリの認証の種類または既存のアプリへのについてIdentityで作成されたアプリに依存しています。

[前提条件]

  • ASP.NET Core を備えた既存の Blazor Web App (.NET 10 以降) Identity
  • .NET SDK (.NET 10 以降)

移行ガイダンスについては、「 ASP.NET Core アプリの移行」を参照してください。

参照元のガイダンス

この記事の .NET 参照ソースへのリンクは、リポジトリの既定のブランチを読み込みます。これは、.NET の次のリリースの現在の開発を表します。 特定のリリースのタグを選択するには、[Switch branches or tags](ブランチまたはタグの切り替え) ドロップダウン リストを使います。 詳細については、「ASP.NET Core ソース コードのバージョン タグを選択する方法」 (dotnet/AspNetCore.Docs #26205) を参照してください。

スキーマ バージョン Identity 更新する

Program.csで、パスキーのサポートを含むスキーマ バージョン 3 を使用するようにIdentity構成を更新します。

builder.Services.AddIdentityCore<ApplicationUser>(options =>
{
    options.SignIn.RequireConfirmedAccount = true;
    options.Stores.SchemaVersion = IdentitySchemaVersions.Version3;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager()
.AddDefaultTokenProviders();

データベース移行を作成して実行する

Visual Studio ソリューション エクスプローラーで、[ 接続済みサービス] をダブルクリックします。 [サービスの依存関係] 領域で、省略記号 (...) を選択し、[SQL Server Express LocalDB] 領域で [移行の追加] を選択します。

移行を説明するために、移行にの移行AddPasskeySupportを付けます。 データベース コンテキストが DbContext クラス名 フィールドに読み込まれるのを待ちます。 [ 完了] を 選択して移行を作成します。 操作が完了したら、[ 閉じる] ボタンを選択します。

省略記号 (...) をもう一度選択し、[ データベースの更新 ] コマンドを選択します。

[最新の移行を使用したデータベースの更新] ダイアログが開きます。 DbContext クラス名フィールドが更新され、以前の移行が読み込まれるまで待ちます。 [完了] ボタンを選択します。 操作が完了したら、[ 閉じる] ボタンを選択します。

パスキー モデル クラスを作成する

Components/Account フォルダー内のプロジェクトに次のモデル クラスを追加し、アプリに一致するようにBlazorWebCSharp._1.Components.Account名前空間を更新します (例: Contoso.Components.Account)。

  • Components/Account/PasskeyInputModel.cs: パスキー サインイン操作 (Login コンポーネント) とパスキーの追加 (Passkeys コンポーネント) の JSON パスキー資格情報を保持します。
  • Components/Account/PasskeyOperation.cs: 実行する認証アクション (PassKeySubmit コンポーネント) を定義します。新しいパスキー (Create/0) を登録するか、既存のパスキー (Request/1) で認証します。

PasskeySubmit コンポーネントを作成する

パスキー操作を処理するために、次の PasskeySubmit コンポーネントを追加します。

Components/Account/Shared/PasskeySubmit.razor

パスキー操作用の JavaScript を追加する

WebAuthn API の対話を処理するために、次の JavaScript ファイルを追加します。

Components/Account/Shared/PasskeySubmit.razor.js

パスキー エンドポイントを追加する

パスキー固有のエンドポイントを含むように、IdentityComponentsEndpointRouteBuilderExtensions.cs ファイルを更新します (または、ファイルが存在しない場合はファイルを作成し、MapAdditionalIdentityEndpoints ファイルでProgramを呼び出します)。

/PasskeyCreationOptions エンドポイントと /PasskeyRequestOptions エンドポイント

ログイン ページを更新する

既存の Login コンポーネントを次のコンポーネントに置き換え、アプリに一致するように BlazorWebCSharp._1.Data 名前空間を更新します (例: Contoso.Components.Account.Data)。

Components/Account/Pages/Login.razor

IdentityRedirectManager クラスにリダイレクト メソッドを追加する

IdentityRedirectManagerComponents/Account/IdentityRedirectManager.cs クラスに次のメソッドを追加します。

public void RedirectToInvalidUser(
    UserManager<ApplicationUser> userManager, HttpContext context) =>
        RedirectToWithStatus("Account/InvalidUser",
            $"Error: Unable to load user with ID '{userManager.GetUserId(context.User)}'.",
            context);

パスキーを追加および名前変更するためのパスキー管理ページを作成する

パスキーを管理するための次の Passkeys コンポーネントを追加し、アプリに一致するように BlazorWebCSharp._1.Data 名前空間を更新します (例: Contoso.Components.Account.Data)。

Components/Account/Pages/Manage/Passkeys.razor

パスキーの名前を変更するための次の RenamePasskey コンポーネントを追加し、アプリに一致するように BlazorWebCSharp._1.Data 名前空間を更新します (例: Contoso.Components.Account.Data)。

Components/Account/Pages/Manage/RenamePasskey.razor

ナビゲーションメニューの管理を更新する

アプリの ManageNavMenu コンポーネントのパスキー管理ページへのリンクを追加します。

Components/Account/Shared/ManageNavMenu.razorで、NavLink コンポーネントに次のPasskeys コンポーネントを追加します。

<li class="nav-item">
    <NavLink class="nav-link" href="Account/Manage/Passkeys">Passkeys</NavLink>
</li>

JavaScript ファイルを含める

App コンポーネント (Components/App.razor) で、Blazor スクリプト タグを見つけます。

<script src="_framework/blazor.web.js"></script>

Blazor スクリプト タグの直後に、PasskeySubmit JavaScript モジュールへの参照を追加します。

<script src="Components/Account/Shared/PasskeySubmit.razor.js" type="module"></script>

パスキーを登録する

パスキー機能をテストするには:

  1. 新しいアカウントを登録するか、既存のアカウントでサインインします。
  2. [ アカウントの管理 ] に移動します (ナビゲーション メニューでユーザー名を選択します)。
  3. ナビゲーション メニューから [パスキー ] を選択します。
  4. [ 新しいパスキーの追加] を選択する
  5. ブラウザーのプロンプトに従って、デバイスの認証システムを使用してパスキーを作成します。

パスキーを使ってサインインする

パスキーの登録後:

  1. アプリからサインアウトします。
  2. ログイン ページで、メール アドレスを入力します。
  3. パスキーを使用してログインを選択します
  4. ブラウザーのプロンプトに従って、パスキーで認証します。
  5. パスキーを追加、名前変更、または削除するには、 Account/Manage/Passkeys に移動します。
  6. passkey でログイン用のパスキーオートフィル (条件付き UI) がサポートされている場合は、パスキーを保存したときに電子メール入力フィールドを選択して、パスキーオートフィル機能をテストします。

PublicKeyCredential.toJSON エラーを軽減する (TypeError: Illegal invocation)

一部のパスワード マネージャーではPublicKeyCredential.toJSONメソッドが正しく実装されていません。これは、パスキー資格情報をシリアル化するときにJSON.stringifyが機能するために必要です。 Blazor Web App プロジェクト テンプレートに基づいてユーザーをアプリに登録または認証すると、パスキーを追加しようとすると、次のエラーがスローされます。

Error: Could not add a passkey: Illegal invocation

このエラーの軽減に関するガイダンスについては、「 Web 認証 API (WebAuthn) パスキーを有効にする」を参照してください。

その他のリソース