使用 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
}