Nguon: Microsoft Learn · .NET 8.0

Tắt chuyển hướng đăng nhập cookie cho các API endpoint đã biết

Nguồn: Cookie login redirects are disabled for known API endpoints

Theo mặc định, các request chưa xác thực và chưa được ủy quyền đến các API endpoint (điểm cuối API) đã biết được bảo vệ bởi cookie authentication (xác thực cookie) giờ đây sẽ nhận được phản hồi 401 và 403 thay vì chuyển hướng đến URI đăng nhập hoặc truy cập bị từ chối.

Các API endpoint đã biết được xác định bằng interface (giao diện) IApiEndpointMetadata mới, và metadata triển khai interface mới đã được thêm tự động vào các endpoint sau:

Phiên bản ra mắt

.NET 10 Preview 7

Hành vi trước đây

Trước đây, cookie authentication handler (trình xử lý xác thực cookie) chuyển hướng các request chưa xác thực và chưa được ủy quyền đến URI đăng nhập hoặc truy cập bị từ chối theo mặc định cho tất cả các request ngoại trừ XMLHttpRequests (XHRs).

Hành vi mới

Kể từ .NET 10, các request chưa xác thực và chưa được ủy quyền đến các API endpoint đã biết sẽ nhận được phản hồi 401 và 403 thay vì chuyển hướng đến URI đăng nhập hoặc truy cập bị từ chối. XHRs tiếp tục nhận được phản hồi 401 và 403 bất kể endpoint đích là gì.

Loại breaking change

Thay đổi này là thay đổi hành vi.

Lý do thay đổi

Thay đổi này được yêu cầu nhiều. Việc chuyển hướng các request chưa xác thực đến trang đăng nhập thường không có ý nghĩa đối với các API endpoint, vốn thường dựa vào mã trạng thái 401 và 403 thay vì HTML redirect (chuyển hướng HTML) để truyền thông tin thất bại xác thực.

Hành động khuyến nghị

Nếu bạn muốn luôn chuyển hướng đến các URI đăng nhập và truy cập bị từ chối cho các request chưa xác thực hoặc chưa được ủy quyền bất kể endpoint đích hay nguồn request, bạn có thể ghi đè RedirectToLoginRedirectToAccessDenied như sau:

csharp
builder.Services.AddAuthentication()
    .AddCookie(options =>
    {
        options.Events.OnRedirectToLogin = context =>
        {
            context.Response.Redirect(context.RedirectUri);
            return Task.CompletedTask;
        };

        options.Events.OnRedirectToAccessDenied = context =>
        {
            context.Response.Redirect(context.RedirectUri);
            return Task.CompletedTask;
        };
    });

Nếu bạn muốn khôi phục đúng hành vi trước đây chỉ tránh chuyển hướng cho XHRs, bạn có thể ghi đè các sự kiện với logic phức tạp hơn một chút:

csharp
builder.Services.AddAuthentication()
    .AddCookie(options =>
    {
        bool IsXhr(HttpRequest request)
        {
            return string.Equals(request.Query[HeaderNames.XRequestedWith], "XMLHttpRequest", StringComparison.Ordinal) ||
                string.Equals(request.Headers.XRequestedWith, "XMLHttpRequest", StringComparison.Ordinal);
        }

        options.Events.OnRedirectToLogin = context =>
        {
            if (IsXhr(context.Request))
            {
                context.Response.Headers.Location = context.RedirectUri;
                context.Response.StatusCode = 401;
            }
            else
            {
                context.Response.Redirect(context.RedirectUri);
            }

            return Task.CompletedTask;
        };

        options.Events.OnRedirectToAccessDenied = context =>
        {
            if (IsXhr(context.Request))
            {
                context.Response.Headers.Location = context.RedirectUri;
                context.Response.StatusCode = 403;
            }
            else
            {
                context.Response.Redirect(context.RedirectUri);
            }

            return Task.CompletedTask;
        };
    });

API bị ảnh hưởng