(21/30)一緒にBlazorを学ぼう:ASP.NET Core Identity(1)

(21/30)一緒にBlazorを学ぼう:ASP.NET Core Identity(1)

今日は認証部分を実装します。

最終更新 2021/12/22 23:01
StrayaWorker
読了目安 2 分
カテゴリ
Blazor
テーマ
一緒にBlazorを学ぶシリーズ
タグ
.NET C# ASP.NET Core Blazor

今日は身分認証の部分を実装します。これまで筆者は ASP.NET Core Web APIBlazor を組み合わせていました。ユーザーが初回ログインに成功した際、バックエンドで RoleClaim などの権限を JWT に保存し、その JWT をブラウザの LocalStorage に保存します。フロントエンド側で AuthenticationStateProvider を自分で書き換え、LocalStorageJWT をチェックし、AuthenticationStateCascadingParameter として各 Component に渡していました。こうすることで、バックエンドと頻繁にデータをやり取りする必要がなくなり、非常に貴重な経験となりました。この経験から身分認証を深く理解できたため、今回は ASP.NET Core 標準の Identity を試してみることにしました。

最初に NeGet から3つのコンポーネントをダウンロードします。それらは Microsoft.AspNetCore.Identity.EntityFrameworkCoreMicrosoft.AspNetCore.Identity.UIMicrosoft.VisualStudio.Web.CodeGeneration.Design です。1つ目は Identity に必須のコンポーネントで、もし自分で JWT を実装したい場合は、最初のコンポーネントだけをダウンロードし、さらに JWT 関連コンポーネント(Microsoft.AspNetCore.Authentication.JwtBearer)をダウンロードすれば十分です。残り2つは ASP.NET Core Identity に標準の Identity ページを生成させるためのコンポーネントです。

次に BlazorServer.ModelsAppDbContext に移動し、継承する DbContextIdentityDbContext に変更します。これにより、これから使用する DBIdentity に関連することを示します。

BlazorServer プロジェクトを右クリックし、「追加」→「新しくスキャフォールディングされたアイテム」を選択します。「ID」タブに切り替え、「ID」を選択します。

「すべてのファイルを置き換える」にチェックを入れ、「データコンテキストクラス」で AppDbContext を選択します。注意点として、先ほど継承元のクラスを IdentityDbContext に変更していないと、AppDbContext が選択肢に表示されません。その場合は右側の「+」記号をクリックして新しく IdentityDbContext を追加する必要があります。

このとき、「FileUpload.OnInitializedAsync(): オーバーライドする適切なメソッドが見つかりません」というエラーが発生することがあります。これは通常 Visual Studio の問題です。その部分をコメントアウトして、前の手順をもう一度繰り返せば解決できます。

次に Program.cs に身分認証のサービスを追加します。Identity はデフォルトで認証情報を Cookie に保存します。

続いて「パッケージ マネージャー コンソール」で2つのコマンドを実行します。Add-Migration IdentitySupportMigration を追加し、Update-DatabaseDB を更新します。データベースを確認すると、6つのテーブルが追加されていることがわかります。最もよく使用するのは AspNetUsersAspNetRolesAspNetUserRoles です。Claim で権限を処理する場合、AspNetUserClaims も使用します。

プロジェクトには Areas フォルダーが追加され、その中に ASP.NET Core Identity の実装が含まれています(ログインシステムアカウントシステム管理システム)。

NavMenu.razorLogin への NavLink を追加します。相対パスでは AreasPages は省略可能です。

<div class="nav-item px-3">
    <NavLink class="nav-link" href="Identity/Account/Login" Match="NavLinkMatch.All">
        <span class="bi bi-file-earmark-lock2 h4 p-2 mb-0" aria-hidden="true"></span> Login
    </NavLink>
</div>

サイトを起動し、左側の Nav から Login ページに移動すると、すでに完成されたログインシステムが表示されます。登録、ログイン、パスワード忘れなどの機能に加え、登録パスワードのルールも設定されています。ルールに従ってアカウントを登録すると、データベースにも登録されたアカウントが生成されます。

登録画面で正しいメールアドレスとパスワードを入力すると、AspNetUsers テーブルで登録したユーザー情報を確認できます。

参照

  1. Claims-based authorization in ASP.NET Core
  2. Claim type and claim value in claims policy based authorization in asp net core
  3. ASP NET Core Identity tutorial from scratch
  4. Unable to resolve service for type IEmailSender while attempting to activate RegisterModel

注:本記事のコードは .NET 6 + Visual Studio 2022 でリファクタリングしています。原文リンクとリファクタリング後のコードを比較して学習してください。ご愛読ありがとうございます。原作者を応援してください。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2021/12/25

(29/30)みんなで学ぶBlazor:Blazor単体テスト

システム開発において最も退屈なプロセスは、おそらくバグ修正です。特に、null オブジェクトにアクセスしようとするエラー(`Object reference not set to an instance of an object.`)は、多くの初心者が最初に直面する問題です。退屈なバグ修正から解放されるために、この記事では「単体テスト」を紹介します。

続きを読む
同じカテゴリ / 同じタグ 2021/12/25

(28/30)みんなで学ぶBlazor:ポリシーベースの認可

以前に「ASP.NET Core Identity」は「Claim」ベースの検証を使用すると述べましたが、実は「ASP.NET Core Identity」には異なる種類の認可方法があります。最も簡単な「ログイン認可」「ロール認可」「Claim認可」ですが、これらはすべて同じ方法で実現されています:原則認可(ポリシーベースの認可)です。

続きを読む