Bagikan melalui


Pengalihan masuk cookie dinonaktifkan untuk titik akhir API yang diketahui

Secara default, permintaan yang tidak diautentikasi dan tidak sah yang dibuat ke titik akhir API yang diketahui dilindungi oleh autentikasi cookie sekarang menghasilkan respons 401 dan 403 daripada mengalihkan ke URI masuk atau ditolak akses.

Titik akhir API yang diketahui diidentifikasi menggunakan antarmuka baruIApiEndpointMetadata, dan metadata yang mengimplementasikan antarmuka baru telah ditambahkan secara otomatis ke yang berikut:

  • [ApiController] Endpoint.
  • Titik akhir API minimal yang membaca badan permintaan JSON atau menulis respons JSON.
  • Titik akhir menggunakan TypedResults jenis pengembalian.
  • Titik akhir SignalR.

Versi yang diperkenalkan

.NET 10 Pratinjau 7

Perilaku sebelumnya

Sebelumnya, handler autentikasi cookie mengalihkan permintaan yang tidak diautentikasi dan tidak sah ke URI masuk atau ditolak akses secara default untuk semua permintaan selain XMLHttpRequests (XHR).

Perilaku baru

Mulai dari .NET 10, permintaan yang tidak diautentikasi dan tidak sah yang dibuat ke titik akhir API yang diketahui menghasilkan respons 401 dan 403 daripada mengalihkan ke URI masuk atau ditolak akses. XHR terus menghasilkan respons 401 dan 403 terlepas dari titik akhir target.

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku .

Alasan perubahan

Perubahan ini sangat diminta. Mengalihkan permintaan yang tidak diautentikasi ke halaman login biasanya tidak masuk akal untuk titik akhir API, yang biasanya mengandalkan kode status 401 dan 403 daripada pengalihan HTML untuk mengomunikasikan kegagalan autentikasi.

Jika Anda ingin selalu mengalihkan ke URI masuk dan akses yang ditolak untuk permintaan yang tidak diautentikasi atau tidak sah terlepas dari titik akhir target atau apakah sumber permintaan adalah XHR, Anda dapat mengambil RedirectToLogin alih dan RedirectToAccessDenied sebagai berikut:

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;
        };
    });

Jika Anda ingin kembali ke perilaku sebelumnya yang tepat yang menghindari pengalihan hanya untuk XHR, Anda dapat mengambil alih peristiwa dengan logika yang sedikit lebih rumit ini:

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 yang terpengaruh