C# Academy · レッスン

カスタム認可要件

カスタム要件とハンドラーを構築します。

レッスン 4/413 ステップ

「カスタム認可要件」は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 age

IAuthorizationRequirement

要件は、ルールのデータを保持するマーカーです。空の 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フィードバックを取得できます。ローカル設定は不要です。

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

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