メインコンテンツへスキップ
ASP.NET Core 実装の完全なソースコードは、この GitHub リポジトリで確認できます。 このガイドでは、シンプルなホスト型ログインを使用します。ASP.NET Core で利用できる標準の Cookie および OIDC ミドルウェアを使用するため、NuGet パッケージをインストールしておいてください。
Install-Package Microsoft.AspNetCore.Authentication.Cookies
Install-Package Microsoft.AspNetCore.Authentication.OpenIdConnect
次に、アプリケーションのミドルウェア パイプラインで、Cookie と OIDC のミドルウェアを構成します。 上記のコードからわかるように、2 種類の認証ミドルウェアを設定しています。 1 つ目は cookie ミドルウェアで、UseCookieAuthentication の呼び出しによって登録されています。2 つ目は OIDC ミドルウェアで、UseOpenIdConnectAuthentication の呼び出しによって設定されます。 ユーザーが OIDC ミドルウェアを使用して Auth0 にサインインすると、その情報は自動的にに保存されます。必要なのは、上記のようにミドルウェアを設定することだけで、あとはユーザーセッションの管理を自動的に処理します。 また、 Connect (OIDC) ミドルウェアは、ユーザーの認証後に Auth0 から送信されるからすべてのクレームを抽出し、それらをClaimsIdentity にクレームとして追加します。

ログアウトを実装する

AuthenticationManager クラスの SignOutAsync メソッドを使用し、サインアウトしたい認証スキームを渡すことで、アプリケーション セッションと Auth0 セッションの両方を制御できます。 たとえば、cookie ミドルウェアからサインアウトしてアプリケーションの認証 cookie をクリアするには、次のように呼び出します。
await HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
同様に、SignOutAsync メソッドを呼び出し、サインアウト対象の認証スキームとして Auth0 を渡すことで、Auth0 からユーザーをログアウトできます。
await HttpContext.Authentication.SignOutAsync("Auth0");
上記を機能させるには、OIDC ミドルウェアの登録時に OnRedirectToIdentityProviderForSignOut イベントを処理する追加の構成も必要です。イベント内では、Auth0 の cookie をクリアするため、Auth0 のログアウトエンドポイント にリダイレクトする必要があります。
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions("Auth0")
{
    // 簡略化のため一部のコードを省略
    Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProviderForSignOut = context =>
        {
            context.Response.Redirect($"https://{auth0Settings.Value.Domain}/v2/logout?client_id={auth0Settings.Value.ClientId}&returnTo={context.Request.Scheme}://{context.Request.Host}/");
            context.HandleResponse();

            return Task.FromResult(0);
        }
    }
});
また、 で、アプリケーションの Allowed Logout URLs にアプリケーションの URL を追加してください。詳細については、ログアウト を参照してください。

Admin 権限の実装

グループを ASP.NET Core アプリケーションに統合する最も簡単な方法は、ASP.NET Core で利用できる組み込みの ロールベースの認可 を使用することです。これを実現するには、次の型のクレームを追加する必要があります
http://schemas.microsoft.com/ws/2008/06/identity/claims/role
ユーザーに割り当てられている各グループごとに。 クレームが追加されると、[Authorize(Roles = "Admin")] 属性でそのクレームを修飾することで、特定のアクションを Admin ユーザーのみが実行できるよう簡単に制限できます。また、コントローラー内から User.IsInRole("Admin") を呼び出して、ユーザーが特定のロールに属しているかどうかをコードで確認することもできます。 ASP.NET OIDC ミドルウェアは、 で返されるすべてのクレームを、自動的に ClaimsIdentity のクレームとして追加します。したがって、authorization クレームから情報を抽出し、そのクレームの JSON 本文をデシリアライズして、各グループについて http://schemas.microsoft.com/ws/2008/06/identity/claims/role クレームを ClaimsIdentity に追加する必要があります。
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions("Auth0")
{
    // 簡潔にするため、一部の設定を省略しています

    Events = new OpenIdConnectEvents
    {
        OnTicketReceived = context =>
        {
            var options = context.Options as OpenIdConnectOptions;

            // ClaimsIdentity を取得する
            var identity = context.Principal.Identity as ClaimsIdentity;
            if (identity != null)
            {
                // グループをロールとして追加する
                var authzClaim = context.Principal.FindFirst(c => c.Type == "authorization");
                if (authzClaim != null)
                {
                    var authorization = JsonConvert.DeserializeObject<Auth0Authorization>(authzClaim.Value);
                    if (authorization != null)
                    {
                        foreach (var group in authorization.Groups)
                        {
                            identity.AddClaim(new Claim(ClaimTypes.Role, group, ClaimValueTypes.String, options.Authority));
                        }
                    }
                }
            }

            return Task.FromResult(0);
        }
    }
});
次に、管理者がタイムシートを承認できるようにするActionを追加します:
[Authorize(Roles = "Admin")]
public IActionResult TimesheetApproval()
{          
    return View();
}