ASP.NET Core Identityのデータ保存先をAzure Table Storageにする方法についてちょっと調査したのでメモしておく。

GitHubにすでにライブラリが作られていて、単純にSQL ServerをAzure Table Storageに置き換えるだけなら、とりあえず下記が使えそう。
GitHub - dlmelendez/identityazuretable: This project provides a high performance cloud solution for ASP.NET Identity Core 1.0 a

データ保存部分のカスタマイズに興味があるので、上記は実装方法の参考にしつつ、アプリケーションにこのライブラリを組み込むところまではまだ試していない。

公式のドキュメントとしては、下記が見つかった。ただ、あまり詳細まで書かれていないので、概要程度の参考にしかならない。
ASP.NET Core Identity 用のカスタム ストレージ プロバイダー | Microsoft Docs

ドキュメントの「ASP.NET Core Identity アーキテクチャ」の図は、イメージをつかむのによいと思う。

ASP.NET Core Identityのデータ保存にかかわる部分は、Identity Manager → Identity Store → データソース、という構造になっている。データ保存先を変える場合は「Identity Store」の部分をカスタマイズして置き換える。逆に「Identity Manager」の部分は触らない。

以下はユーザー登録ページの処理の抜粋。_userManagerは、DIされるUserManagerクラスのオブジェクトで「Identity Manager」の構成要素の一つ。

var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{

Webページからは「Identity Manager」関連のクラスしか操作せず、「Identity Store」は「Identity Manager」の内部で呼ばれる形になる。

上記の公式ページの最後にはConfigureServicesの実装例も載っているが、ここはほぼそのまま流用できる。

servicesに対する、AddDbContext、AddEntityFrameworkStores拡張メソッドの呼び出しは削除して、別のDIによって代替する。

代わりにDIするのは、IUserStoreを実装するクラスと、IRoleStoreを実装するクラス、後はそのクラスの中でデータアクセスに使うXXContextのようなクラスになる。

IRoleStoreを実装するクラスは、アプリケーションでロールを扱わないのであれば省略可能。
※ConfigureServicesで以下のようにAddDefaultIdentityを使ったときは、IRoleStoreの実装クラスは作らなくても動作した。

services.AddDefaultIdentity<ApplicationUser>();

IUserStoreを実装するクラスがユーザー情報の登録取得に使うメインの処理になるので、ここを作るのが主な作業になる。

Identityの基本的な処理を実行するだけでも、パスワードハッシュを保存したりする必要があるので、IUserStore以外にも最低限必要なインターフェースが複数あり、こういう実装を簡単にするためUserStoreBaseという抽象クラスがあるので、実際のコーディングはこの抽象クラスを継承する形にするとよい。
UserStoreBase Class (Microsoft.AspNetCore.Identity) | Microsoft Docs

これを使うにはNugetパッケージ Microsoft.Extensions.Identity.Stores が必要なので、事前にパッケージをインストールしておく。

UserStoreBaseは型パラメータが5個あるが、TKeyについてはstringにしておけば問題ない。あとの4つは各クラスごとに制約に従って適当にエンティティクラスを作る。

UserStoreBaseを継承するとメソッドをたくさんオーバーライドすることになるが、これらのメソッド全部をちゃんと実装する必要はない。Identityで使う機能によって実際に呼び出されるメソッドは違うので、メソッドは仮実装のままにして、動かしながら実装を追加していくと効率的に作業できる。

ASP.NET Core Identityのデータ保存先をAzure Table StorageにしたサンプルのソースをGitHubで公開した。
https://github.com/morituriblog/identity-custom-store01
※ユーザー登録、ログイン、ログアウトのみできる。
※Identity関連のページはデフォルトのApplicationDbContextからスキャフォールディングした。
 ASP.NET Core プロジェクトでスキャフォールディング Id | Microsoft Docs
 (スキャフォールディングするためには、SQL ServerのApplicationDbContextが必要だった)