次の方法で共有


.NET マイクロサービスと Web アプリケーションでの承認について

ヒント

このコンテンツは、.NET Docs で入手できる、またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できる、コンテナー化された .NET アプリケーションの電子ブックである .NET マイクロサービス アーキテクチャからの抜粋です。

コンテナー化された .NET アプリケーションの .NET マイクロサービス アーキテクチャの電子ブックの表紙サムネイル。

認証後、ASP.NET Core Web API はアクセスを承認する必要があります。 このプロセスにより、サービスはすべてのユーザーではなく一部の認証されたユーザーだけに API の使用を許可することができます。 承認 は、ユーザーのロールまたはカスタム ポリシーに基づいて行うことができます。これには、クレームやその他のヒューリスティックの検査が含まれる場合があります。

ASP.NET Core MVC ルートへのアクセスの制限は、次の例に示すように、アクション メソッド (またはすべてのコントローラーのアクションで承認が必要な場合はコントローラーのクラス) に Authorize 属性を適用するのと同じくらい簡単です。

public class AccountController : Controller
{
    public ActionResult Login()
    {
    }

    [Authorize]
    public ActionResult Logout()
    {
    }
}

既定では、パラメーターを指定せずに Authorize 属性を追加すると、そのコントローラーまたはアクションの認証済みユーザーへのアクセスが制限されます。 特定のユーザーのみが使用できるように API をさらに制限するために、属性を展開して、ユーザーが満たす必要がある必要があるロールまたはポリシーを指定できます。

ロールベースの承認を実装する

ASP.NET Core Identity には、ロールの概念が組み込まれています。 ASP.NET Core Identity は、ユーザーに加えて、アプリケーションで使用されるさまざまなロールに関する情報を格納し、どのユーザーがどのロールに割り当てられているかを追跡します。 これらの割り当ては、永続化されたストレージのロールを更新する RoleManager の種類と、ユーザーにロールを許可または取り消すことができる UserManager の種類を使用して、プログラムによって変更できます。

JWT ベアラー トークンを使用して認証する場合、ASP.NET Core JWT ベアラー認証ミドルウェアは、トークンで見つかったロール要求に基づいてユーザーのロールを設定します。 MVC アクションまたはコントローラーへのアクセスを特定のロールのユーザーに制限するには、次のコード フラグメントに示すように、Authorize 注釈 (属性) に Roles パラメーターを含めることができます。

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

この例では、ControlPanel コントローラー (SetTime アクションの実行など) の API にアクセスできるのは、管理者ロールまたは PowerUser ロールのユーザーだけです。 ShutDown API は、管理者ロールのユーザーにのみアクセスを許可するようにさらに制限されます。

ユーザーを複数のロールに含める必要がある場合は、次の例に示すように、複数の Authorize 属性を使用します。

[Authorize(Roles = "Administrator, PowerUser")]
[Authorize(Roles = "RemoteEmployee ")]
[Authorize(Policy = "CustomPolicy")]
public ActionResult API1 ()
{
}

この例では、API1 を呼び出すには、ユーザーが次の操作を行う必要があります。

  • Administrator "または" PowerUser ロールであり、"かつ"

  • RemoteEmployee ロールであり、かつ

  • CustomPolicy 承認のためのカスタム ハンドラーを満たしている。

ポリシー ベースの承認を実装する

カスタム承認規則は、 承認ポリシーを使用して記述することもできます。 このセクションでは、概要について説明します。 詳細については、 ASP.NET 承認ワークショップを参照してください。

カスタム承認ポリシーは、サービスの AddAuthorization メソッドを使用して Startup.ConfigureServices メソッド内で登録されます。 このメソッドは、AuthorizationOptions 引数を構成するデリゲートを受け取ります。

services.AddAuthorization(options =>
{
    options.AddPolicy("AdministratorsOnly", policy =>
        policy.RequireRole("Administrator"));

    options.AddPolicy("EmployeesOnly", policy =>
        policy.RequireClaim("EmployeeNumber"));

    options.AddPolicy("Over21", policy =>
        policy.Requirements.Add(new MinimumAgeRequirement(21)));
});

例に示すように、ポリシーはさまざまな種類の要件に関連付けることができます。 ポリシーを登録した後は、ポリシーの名前を Authorize 属性の Policy 引数として渡すことによって、アクションまたはコントローラーに適用できます (たとえば、 [Authorize(Policy="EmployeesOnly")]) ポリシーには、(次の例に示すように) 1 つだけでなく、複数の要件を持つことができます。

前の例では、最初の AddPolicy 呼び出しは、ロールによる承認の代替方法にすぎません。 [Authorize(Policy="AdministratorsOnly")]が API に適用されている場合、管理者ロールのユーザーのみがアクセスできます。

2 番目の AddPolicy 呼び出しは、特定の要求をユーザーに対して存在させる必要があることを簡単に要求する方法を示しています。 また、 RequireClaim メソッドは、必要に応じて要求の予期される値を受け取ります。 値が指定されている場合、要件は、ユーザーが正しい型の要求と指定した値の 1 つの両方を持っている場合にのみ満たされます。 JWT ベアラー認証ミドルウェアを使用している場合は、すべての JWT プロパティをユーザー要求として使用できます。

ここで示す最も興味深いポリシーは、カスタム承認要件を使用するため、3 番目の AddPolicy メソッドにあります。 カスタム承認要件を使用すると、承認の実行方法を大きく制御できます。 これを機能させるには、次の型を実装する必要があります。

  • IAuthorizationRequirementから派生し、要件の詳細を指定するフィールドを含む Requirements 型。 この例では、これはサンプルの MinimumAgeRequirement 型の年齢フィールドです。

  • AuthorizationHandler<TRequirement>を実装するハンドラー。ここで、T はハンドラーが満たすことができるIAuthorizationRequirementの型です。 ハンドラーは、 HandleRequirementAsync メソッドを実装する必要があります。このメソッドは、ユーザーに関する情報を含む指定されたコンテキストが要件を満たしているかどうかを確認します。

ユーザーが要件を満たしている場合、 context.Succeed の呼び出しは、ユーザーが承認されていることを示します。 ユーザーが承認要件を満たす方法が複数ある場合は、複数のハンドラーを作成できます。

カスタム ポリシー要件を AddPolicy 呼び出しに登録するだけでなく、依存関係の挿入 (services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>()) を使用してカスタム要件ハンドラーを登録する必要もあります。

( DateOfBirth 要求に基づいて) ユーザーの年齢を確認するためのカスタム承認要件とハンドラーの例については、ASP.NET Core 承認ドキュメントを参照してください

認証とシンプルなAPI

ASP.NET では、コントローラー ベースの API の代わりに最小限の API がサポートされます。 承認ポリシーは、最小限の API の承認を構成するための推奨される方法です。次の例を示します。

// Program.cs
builder.Services.AddAuthorizationBuilder()
  .AddPolicy("admin_greetings", policy =>
        policy
            .RequireRole("admin")
            .RequireScope("greetings_api"));

// build the app

app.MapGet("/hello", () => "Hello world!")
  .RequireAuthorization("admin_greetings");

その他のリソース