ロールベース認可
ユーザーのロールによってエンドポイントへのアクセスを制限します。
「ロールベース認可」は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フィードバックを取得できます。ローカル設定は不要です。