カスタム認可要件
カスタム要件とハンドラーを構築します。
「カスタム認可要件」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
組み込み機能では不十分な場合
「18歳以上であること」や「このリソースを所有していること」など、RequireRole や RequireClaim では表現できないルールがあります。
このような場合は、カスタムの要件とハンドラーを作成します。
// Rule: user must be older than a configurable minimum ageIAuthorizationRequirement
要件は、ルールのデータを保持するマーカーです。空の IAuthorizationRequirement インターフェイスを実装します。
public class MinimumAgeRequirement : IAuthorizationRequirement
{
public int MinimumAge { get; }
public MinimumAgeRequirement(int minimumAge) =>
MinimumAge = minimumAge;
}AuthorizationHandler
ハンドラーにはロジックを記述します。AuthorizationHandler<TRequirement> を継承し、HandleRequirementAsync をオーバーライドします。
public class MinimumAgeHandler
: AuthorizationHandler<MinimumAgeRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
MinimumAgeRequirement requirement)
{
// logic goes here
return Task.CompletedTask;
}
}要件の成功
ハンドラー内でユーザーのクレームを確認します。ルールを満たしている場合は context.Succeed(requirement) を呼び出します。満たしていない場合は、呼び出さずにそのまま戻ります。
var dobClaim = context.User.FindFirst("birthdate");
if (dobClaim is null) return Task.CompletedTask;
var dob = DateTime.Parse(dobClaim.Value);
int age = DateTime.UtcNow.Year - dob.Year;
if (dob > DateTime.UtcNow.AddYears(-age)) age--;
if (age >= requirement.MinimumAge)
context.Succeed(requirement);
return Task.CompletedTask;成功時に Succeed を呼び出し、失敗時は何もしない
要件を満たした場合は Succeed を呼び出し、それ以外の場合は何もしないようにします。同じ要件に対する他のハンドラーの結果にかかわらず必ず失敗させたい場合にのみ、context.Fail() を呼び出します。
// Soft: let other handlers also try
if (ok) context.Succeed(requirement);
// Hard: force failure no matter what
if (blocked) context.Fail();ハンドラーの登録
ハンドラーを IAuthorizationHandler として DI に登録します。スコープ付きサービスに依存しない限り、通常はシングルトンにします。
builder.Services.AddSingleton<
IAuthorizationHandler, MinimumAgeHandler>();ポリシーへの追加
AddRequirements(または Requirements.Add)を使って、名前付きポリシーに要件を追加します。ハンドラーは型によって自動的に対応付けられます。
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AtLeast18", policy =>
policy.AddRequirements(new MinimumAgeRequirement(18)));
});ポリシーの使用
他の名前付きポリシーと同じように適用します。
[Authorize(Policy = "AtLeast18")]
[HttpGet("age-restricted")]
public IActionResult Restricted() => Ok();リソースベースの認可
「特定のドキュメントの所有者だけが編集できる」など、特定のインスタンスに対して認可するには、リソースを受け取るオーバーロードを使用します。リソースはハンドラーのコンテキストに渡されます。
public class OwnerHandler
: AuthorizationHandler<OwnerRequirement, Document>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
OwnerRequirement requirement,
Document resource)
{
var userId = context.User.FindFirstValue(
ClaimTypes.NameIdentifier);
if (resource.OwnerId.ToString() == userId)
context.Succeed(requirement);
return Task.CompletedTask;
}
}IAuthorizationService の呼び出し
リソースベースのチェックは、注入された IAuthorizationService を使ってアクション内で命令的に実行します。
public async Task<IActionResult> Edit(int id)
{
var doc = await _db.Documents.FindAsync(id);
var result = await _authz.AuthorizeAsync(
User, doc, "DocumentOwner");
if (!result.Succeeded) return Forbid();
return Ok(doc);
}1つの要件に対する複数のハンドラー
1つの要件に複数のハンドラーを設定できます。いずれかのハンドラーが成功すれば、要件は満たされます。これにより、OR 条件を簡潔に表現できます(ハンドラーが Fail を呼び出す場合を除きます)。
// e.g. allow if owner OR if admin role
services.AddSingleton<IAuthorizationHandler, OwnerHandler>();
services.AddSingleton<IAuthorizationHandler, AdminOverrideHandler>();クイックチェック
ハンドラーについての理解度を確認しましょう。
まとめ
カスタム認可を構築しました。
IAuthorizationRequirementは、ルールのデータを保持します。AuthorizationHandler<T>はロジックを持ち、Succeedを呼び出します。- ハンドラーを
IAuthorizationHandlerとして登録し、要件をポリシーに追加します。 - リソースベースのハンドラーと
IAuthorizationServiceを使うと、特定のインスタンスを認可できます。
これで認可コースは完了です。
AI チューターと学ぶ C# — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 93
- レッスン
- 346
よくある質問
「カスタム認可要件」レッスンは無料ですか?
はい。「カスタム認可要件」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「カスタム認可要件」で何を学びますか?
カスタム要件とハンドラーを構築します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「カスタム認可要件」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。