次の方法で共有


ASP.NET Core での API エンドポイント認証の動作

cookie認証を使用する場合、認証されていない要求をログイン ページにリダイレクトするのではなく、認証エラーに対して API エンドポイントから適切な HTTP 状態コード (401 や 403 など) が返されます。 この動作は、プログラムによる API アクセスに適しており、.NET 10 の ASP.NET Core で導入されました。

ASP.NET Core で API エンドポイントを識別する方法

ASP.NET Core では、次のような API 関連として認識されるエンドポイントに、この動作が自動的に適用されます。

  • [ApiController]属性で装飾されたコントローラー
  • MapGetMapPostMapPutMapDeleteなどに登録された最小限の API エンドポイント。
  • JSON 応答を明示的に要求するエンドポイント
  • SignalR ハブとエンドポイント

既定の動作とカスタマイズ

既定では、ASP.NET Core では、エンドポイントの種類 cookie 基づいて認証ロジックが適用されます。

  • Web ページ: ログイン ページにリダイレクトする
  • API エンドポイント: リダイレクトなしで 401 または 403 状態コードを返す

動作の構成

既定の動作はほとんどのシナリオで機能しますが、必要に応じてカスタマイズできます。

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/Account/Login";
        // The framework automatically handles API endpoints
        // No additional configuration needed
    });

特定のエンドポイントの自動検出をオーバーライドする必要がある場合は、特定の認証スキームで [Authorize] 属性を使用するか、カスタム認証ハンドラーを実装します。

移行に関する考慮事項

.NET 10 で導入されたこの動作の変更は、既存のアプリケーションに対して互換性を損なうように設計されています。

  • Web アプリケーション: ログイン ページのリダイレクトを使用して以前と同様に作業を続ける
  • 混合アプリケーション: API エンドポイントは適切な状態コードを取得し、Web ページはリダイレクトを取得します
  • API 専用アプリケーション: 追加の構成なしで適切な HTTP 状態コードを利用する

API エンドポイントのテスト

ASP.NET Core 10 にアップグレードした後、API エンドポイントから適切な状態コードが返されることを確認します。

[Test]
public async Task UnauthorizedApiRequest_Returns401()
{
    var response = await client.GetAsync("/api/secure-data");
    Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
    Assert.False(response.Headers.Location != null); // No redirect
}