Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í.
Doporučená akce
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
-
Microsoft.AspNetCore.Http.Metadata.IApiEndpointMetadata - Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents.RedirectToLogin
- Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents.RedirectToAccessDenied