Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Som standard resulterar oautentiserade och obehöriga begäranden som görs till kända API-slutpunkter som skyddas av cookieautentisering nu i 401- och 403-svar i stället för att omdirigeras till en inloggning eller åtkomst nekad URI.
Kända API-slutpunkter identifieras med det nya IApiEndpointMetadata gränssnittet och metadata som implementerar det nya gränssnittet har lagts till automatiskt till följande:
-
[ApiController]Slutpunkter. - Minimala API-slutpunkter som läser JSON-begärandeorgan eller skriver JSON-svar.
- Slutpunkter med hjälp av TypedResults returtyper.
- SignalR-slutpunkter.
Version lanserad
.NET 10 Förhandsversion 7
Tidigare beteende
Tidigare omdirigerade cookieautentiseringshanteraren oautentiserade och obehöriga begäranden till en inloggning eller åtkomst nekad URI som standard för alla andra begäranden än XMLHttpRequests (XHRs).
Nytt beteende
Från och med .NET 10 resulterar oautentiserade och obehöriga begäranden som görs till kända API-slutpunkter i 401- och 403-svar i stället för att omdirigeras till en inloggning eller åtkomst nekad URI. XHR:er fortsätter att resultera i 401- och 403-svar oavsett målslutpunkt.
Typ av brytande ändring
Den här ändringen är en beteendeförändring.
Orsak till ändring
Den här ändringen begärdes starkt. Att omdirigera oautentiserade begäranden till en inloggningssida är vanligtvis inte meningsfullt för API-slutpunkter, som vanligtvis förlitar sig på statuskoder för 401 och 403 i stället för HTML-omdirigeringar för att kommunicera autentiseringsfel.
Rekommenderad åtgärd
Om du alltid vill omdirigera till inloggnings- och åtkomstnekande URI:er för oautentiserade eller obehöriga begäranden oavsett målslutpunkten eller om källan till begäran är en XHR kan du åsidosätta RedirectToLogin och RedirectToAccessDenied så här:
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;
};
});
Om du vill återgå till det exakta tidigare beteende som undviker omdirigering för endast XHR kan du åsidosätta händelserna med den här något mer komplicerade logiken:
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;
};
});
Berörda API:er
-
Microsoft.AspNetCore.Http.Metadata.IApiEndpointMetadata - Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents.RedirectToLogin
- Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents.RedirectToAccessDenied