다음을 통해 공유


알려진 API 엔드포인트에 대해 쿠키 로그인 리디렉션을 사용할 수 없습니다.

기본적으로 쿠키 인증으로 보호되는 알려진 API 엔드포인트에 대한 인증되지 않은 권한 없는 요청은 이제 로그인 또는 액세스 거부 URI로 리디렉션되지 않고 401 및 403 응답을 생성합니다.

알려진 API 엔드포인트 는 새 IApiEndpointMetadata 인터페이스를 사용하여 식별되며 새 인터페이스를 구현하는 메타데이터가 다음 항목에 자동으로 추가되었습니다.

  • [ApiController] 끝점.
  • JSON 요청 본문을 읽거나 JSON 응답을 작성하는 최소 API 엔드포인트입니다.
  • 반환 형식을 사용하는 TypedResults 엔드포인트입니다.
  • SignalR 엔드포인트.

도입된 버전

.NET 10 미리 보기 7

이전 동작

이전에는 쿠키 인증 처리기가 인증되지 않은 권한 없는 요청을 기본적으로 XMLHttpRequests(XHR) 이외의 모든 요청에 대해 로그인 또는 액세스 거부 URI로 리디렉션했습니다.

새 동작

.NET 10부터 알려진 API 엔드포인트에 대한 인증되지 않은 권한 없는 요청은 로그인 또는 액세스 거부 URI로 리디렉션되지 않고 401 및 403 응답을 생성합니다. XHR은 대상 엔드포인트에 관계없이 401 및 403 응답을 계속 생성합니다.

파괴적 변경 유형

이 변경 사항은 행동 변화입니다.

변경 이유

이 변경은 매우 요청되었습니다. 인증되지 않은 요청을 로그인 페이지로 리디렉션하는 것은 일반적으로 인증 실패를 전달하기 위해 HTML 리디렉션이 아닌 401 및 403 상태 코드를 사용하는 API 엔드포인트에 적합하지 않습니다.

대상 엔드포인트 또는 요청 원본이 XHR인지 여부에 관계없이 인증되지 않거나 권한이 없는 요청에 대해 항상 로그인 및 액세스 거부 URI로 리디렉션하려는 경우 다음과 같이 재정 RedirectToLoginRedirectToAccessDenied 의할 수 있습니다.

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

XHR에 대해서만 리디렉션하지 않는 정확한 이전 동작으로 되돌리려면 약간 더 복잡한 이 논리를 사용하여 이벤트를 재정의할 수 있습니다.

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