共用方式為


ASP.NET Core 中的 API 端點驗證行為

使用 cookie 驗證時,API 端點會針對驗證失敗傳回適當的 HTTP 狀態碼 (例如 401 或 403),而不是將未經驗證的請求重新導向至登入頁面。 此行為更適合程式設計 API 存取,是在 .NET 10 的 ASP.NET Core 中引進。

ASP.NET Core 如何識別 API 端點

ASP.NET Core 會自動將此行為套用至其識別為與 API 相關的端點,包括:

  • 以屬性裝飾的 [ApiController] 控制器
  • 向 、 MapGetMapPostMapPut等註冊的MapDelete最小 API 端點。
  • 明確要求 JSON 回應的端點
  • SignalR 中樞和端點

預設行為和自訂

依預設,ASP.NET Core cookie 會根據端點類型套用驗證邏輯:

  • 網頁:重新導向至登入頁面
  • 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 端點獲得正確的狀態代碼,而網頁獲得重定向
  • 僅 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
}