Sdílet prostřednictvím


Přesměrování přihlášení k souborům cookie jsou zakázána pro známé koncové body rozhraní API.

Ve výchozím nastavení neověřené a neoprávněné požadavky provedené do známých koncových bodů rozhraní API chráněných ověřováním souborů cookie teď vedou k odpovědím 401 a 403 místo přesměrování na přihlašovací nebo přístup odepřený identifikátor URI.

Známé koncové body rozhraní API se identifikují pomocí nového IApiEndpointMetadata rozhraní a metadata, která implementují nové rozhraní, se automaticky přidala do následujících položek:

  • [ApiController] Koncové body.
  • Minimální koncové body rozhraní API, které čtou těla požadavků JSON nebo zapisují odpovědi JSON.
  • Koncové body používající TypedResults návratové typy
  • Koncové body SignalR.

Verze byla představena

.NET 10 Preview 7

Předchozí chování

Dříve obslužná rutina ověřování souborů cookie přesměrovala neověřené a neautorizované požadavky na identifikátor URI přihlášení nebo odepření přístupu ve výchozím nastavení pro všechny požadavky jiné než XMLHttpRequests (XHRs).

Nové chování

Počínaje rozhraním .NET 10 vedou neověřené a neautorizované požadavky na známé koncové body rozhraní API k tomu, aby odpovědi 401 a 403 nepřesměrovaly na přihlašovací nebo přístupově odepřený identifikátor URI. XHRS nadále vede k odpovědím 401 a 403 bez ohledu na cílový koncový bod.

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Tato změna byla velmi požadována. Přesměrování neověřených požadavků na přihlašovací stránku obvykle nedává smysl pro koncové body rozhraní API, které se obvykle spoléhají na stavové kódy 401 a 403 místo přesměrování HTML na selhání ověřování.

Pokud chcete vždy přesměrovat na přihlašovací identifikátory URI a identifikátory URI odepření přístupu pro neověřené nebo neoprávněné požadavky bez ohledu na cílový koncový bod nebo jestli je zdrojem požadavku XHR, můžete je přepsat RedirectToLogin a RedirectToAccessDenied následujícím způsobem:

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

Pokud se chcete vrátit k přesnému předchozímu chování, které se vyhne přesměrování pouze pro XHR, můžete události přepsat o něco složitější logikou:

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

Ovlivněná rozhraní API