要約
ASP.NET Core Webアプリケーションを作成する際の要件として
- 外部認証を利用する
- 認証情報のDB管理はしない
この2点がある場合、認証まわりのUIには「ASP.NET Core Identity」ではなく「Microsoft Identity Web UI」を利用すべきです。
ASP.NET Core Identity
ASP.NET Core Identityは、以下の機能を提供するライブラリです。
- 認証まわりのUI
- 認証情報のDB管理
注意すべきは、このライブラリが__「認証情報のDB管理」機能の利用を前提__としている点です。
認証情報のDB管理機能は除外が困難
「外部認証を利用するけど認証情報のDB管理はしない」というケースにおいて、「ASP.NET Core IdentityのUI機能だけ利用してDB管理機能は無効化する」というアプローチは実装が困難です。
調べればやり方は出てくるかもしれませんが、ライブラリの内部構造に依存した作りになってしまうため、このアプローチは推奨しません。
Microsoft Identity Web UI
認証まわりのUIだけを利用したい場合は、Microsoft Identity Web UIがオススメです。
これはMicrosoft Identity Web(OpenID Connect認証ライブラリ)に付随して作られたUIライブラリです。
OpenID Connectの場合
外部認証のプロトコルがOpenID Connectの場合は、Microsoft Identity Webと合わせてMicrosoft Identity Web UIをそのまま利用できます。
それ以外の場合
外部認証のプロトコルがOpenID Connect以外の場合、Microsoft Identity Webは使えないため、認証機能の実装には他のライブラリを利用することになります。
そしてMicrosoft Identity Web UIを利用する際も注意点があり、サインイン・サインアウトのリンクを作る際に「schemeパラメータ」が必要になります。
こちらのソースコードにあるAccountControllerのSignIn()
およびSignOut()
を利用するのですが、schemeパラメータを渡さない場合はデフォルトでOpenID Connectの処理をする仕様になっています。
そのため、それ以外のプロトコルを利用する場合は、schemeパラメータにプロトコルを指定してリンクを作る必要があります。具体例として、WS-Federationの場合は以下のようになります(こちらのライブラリが別途必要です)。
+@using Microsoft.AspNetCore.Authentication.WsFederation
// 省略
- <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut">Sign out</a>
+ <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut" asp-route-scheme="@WsFederationDefaults.AuthenticationScheme">Sign out</a>
// 省略
- <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn">Sign in</a>
+ <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn" asp-route-scheme="@WsFederationDefaults.AuthenticationScheme">Sign in</a>