Aracılığıyla paylaş


Bilinen API uç noktaları için cookie tabanlı oturum açma yeniden yönlendirmeleri kapatılmıştır

Varsayılan olarak, tanımlama bilgisi kimlik doğrulamasıyla korunan bilinen API uç noktalarına yapılan kimliği doğrulanmamış ve yetkisiz istekler artık oturum açma veya erişim reddi URI'sine yönlendirmek yerine 401 ve 403 yanıtlarıyla sonuçlanır.

Bilinen API uç noktaları yeni arabirim kullanılarak tanımlanır ve yeni IApiEndpointMetadata arabirimi uygulayan meta veriler aşağıdakilere otomatik olarak eklenir:

  • [ApiController] Bitiş noktası.
  • JSON istek gövdelerini okuyan veya JSON yanıtları yazan en düşük API uç noktaları.
  • TypedResults dönüş türlerini kullanan uç noktalar.
  • SignalR uç noktaları.

Sürüm kullanıma sunulmuştur

.NET 10 Preview 7

Önceki davranış

Daha önce çerez kimlik doğrulama işleyicisi, XMLHttpRequests (XHRs) dışındaki tüm istekler için kimliği doğrulanmamış ve yetkisiz istekleri varsayılan olarak oturum açma veya erişim reddedildiğinde URI'ye yönlendiriyordu.

Yeni davranış

.NET 10'dan başlayarak, bilinen API uç noktalarına yapılan kimliği doğrulanmamış ve yetkisiz istekler, oturum açma veya erişim reddi URI'sine yönlendirmek yerine 401 ve 403 yanıtlarıyla sonuçlanır. XHD'ler hedef uç nokta ne olursa olsun 401 ve 403 yanıtlarıyla sonuçlanır.

Kesinti yaratan değişiklik türü

Bu değişiklik davranışsal bir değişikliktir.

Değişiklik nedeni

Bu değişiklik çok istendi. Kimliği doğrulanmamış istekleri oturum açma sayfasına yönlendirmek genellikle kimlik doğrulama hatalarını iletmek için HTML yeniden yönlendirmeleri yerine 401 ve 403 durum kodlarını kullanan API uç noktaları için anlamlı değildir.

tr-TR: İstek hedef uç noktasından veya kaynağının XHR olmasından bağımsız olarak, kimliği doğrulanmamış veya yetkisiz talepler için her zaman oturum açma ve erişim reddedilme URI'lerine yönlendirmek istiyorsanız, RedirectToLogin ve RedirectToAccessDenied öğelerini aşağıdaki gibi geçersiz kılabilirsiniz.

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

Yalnızca XHR'ler için yönlendirmeyi engelleyen önceki davranışı tam olarak geri yüklemek istiyorsanız, olayları biraz daha karmaşık bir mantıkla geçersiz kılabilirsiniz:

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

Etkilenen API'ler