0Pricing
C# Academy · レッスン

ロールベース認可

ユーザーのロールによってエンドポイントへのアクセスを制限します。

「ロールベース認可」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

認証と認可

認証は「あなたは誰ですか?」という問いに答えます。認可は「何を許可されていますか?」という問いに答えます。

ASP.NET Core で最もシンプルな認可モデルはロールベースです。ユーザーはロールに所属し、エンドポイントは特定のロールを要求します。

// User has roles: admin, editor
// Endpoint requires: admin

ロールの由来

ロールは、ClaimTypes.Role 型のクレームにすぎません。JWT を発行するときは、ユーザーが持つロールごとに1つのロールクレームを追加します。

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
    new Claim(ClaimTypes.Role, "admin"),
    new Claim(ClaimTypes.Role, "editor")
};

ロールクレームの種類

[Authorize(Roles=...)] と User.IsInRole を機能させるには、ハンドラーがどのクレーム種別をロールとして扱うかを認識している必要があります。

JWT キー role は既定で ClaimTypes.Role にマッピングされます。カスタムキーを使う場合は、RoleClaimType でバリデーターに指定します。

options.TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = ClaimTypes.Role
};

単一のロールの要求

コントローラーまたはアクションに [Authorize(Roles = "admin")] を適用します。admin ロールを持つユーザーだけがアクセスできます。

[Authorize(Roles = "admin")]
[HttpDelete("users/{id}")]
public IActionResult DeleteUser(int id)
{
    // only admins reach here
    return NoContent();
}

複数のロールのいずれかを要求

コンマ区切りのリストはORを意味します。ユーザーは、指定されたロールのうち少なくとも1つを持っている必要があります。

[Authorize(Roles = "admin,editor")]
[HttpPut("articles/{id}")]
public IActionResult Update(int id) => Ok();
// admins OR editors are allowed

複数のロールを要求(AND)

複数のロールすべてを要求するには、複数の [Authorize] 属性を重ねて指定します。それぞれの属性をすべて満たす必要があります。

[Authorize(Roles = "employee")]
[Authorize(Roles = "manager")]
public IActionResult ApproveBudget() => Ok();
// must be BOTH employee AND manager

コードでのロールチェック

ドアでのチェックだけでなく、メソッド本体内でロールを確認する必要がある場合があります。そのときは User.IsInRole を使用します。

public IActionResult GetReport()
{
    var data = BuildReport();
    if (User.IsInRole("admin"))
        data.IncludeSensitiveColumns();
    return Ok(data);
}

Minimal API での同等の方法

Minimal API では、インラインポリシーとともに .RequireAuthorization を使用します。より簡単な方法として、名前付きポリシーを通じてロールを要求することもできます。

app.MapDelete("/users/{id}", (int id) => Results.NoContent())
   .RequireAuthorization(p => p.RequireRole("admin"));

階層構造でのロール

ASP.NET Core には、組み込みのロール階層はありません。管理者が暗黙的に編集者の権限も持つようにするには、ログイン時に両方のロールクレームを付与するか、ポリシーでモデル化します(次のコースで扱います)。

// Grant both at login if admin >= editor
new Claim(ClaimTypes.Role, "admin");
new Claim(ClaimTypes.Role, "editor");

ロールでは不十分な場合

ロールは大まかな権限単位です。ルールがデータ(例:「所有者だけが編集できる」)や細かな権限に依存する場合、ロールチェックは複雑になります。

そのような場合に、クレームベースおよびポリシーベースの認可を使用します。

// Hard to express with roles alone:
// "editors, but only for their own department"

403 と 401 の使い分け

ユーザーが認証されていない場合、ロールチェックの結果は 401 Unauthorized になります。認証済みでも必要なロールを持っていない場合は、403 Forbidden が返されます。

// No/invalid token         -> 401 Unauthorized
// Valid token, wrong role   -> 403 Forbidden

クイックチェック

ロールについての理解度を確認しましょう。

まとめ

ロールベースの認可について学びました。

  • ロールは、トークンに格納される ClaimTypes.Role クレームです。
  • [Authorize(Roles = "a,b")] は OR を意味し、属性を重ねて指定すると AND になります。
  • User.IsInRole を使うと、コード内でロールを確認できます。
  • ロールは大まかな権限単位であり、データに基づくルールには、より豊かなモデルが必要です。

次は、クレームベースの認可です。

よくある質問

「ロールベース認可」レッスンは無料ですか?

はい。「ロールベース認可」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「ロールベース認可」で何を学びますか?

ユーザーのロールによってエンドポイントへのアクセスを制限します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ロールベース認可」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ロールベース認可
  2. クレームベース認可
  3. ポリシーベース認可
  4. カスタム認可要件
← C# Academyに戻る