cookie認証を使用する場合、認証されていない要求をログイン ページにリダイレクトするのではなく、認証エラーに対して API エンドポイントから適切な HTTP 状態コード (401 や 403 など) が返されます。 この動作は、プログラムによる API アクセスに適しており、.NET 10 の ASP.NET Core で導入されました。
ASP.NET Core で API エンドポイントを識別する方法
ASP.NET Core では、次のような API 関連として認識されるエンドポイントに、この動作が自動的に適用されます。
-
[ApiController]属性で装飾されたコントローラー -
MapGet、MapPost、MapPut、MapDeleteなどに登録された最小限の 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
}
関連トピック
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
ASP.NET Core