기본적으로 쿠키 인증으로 보호되는 알려진 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
-
Microsoft.AspNetCore.Http.Metadata.IApiEndpointMetadata - Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents.RedirectToLogin
- Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents.RedirectToAccessDenied
.NET