Ich versuche, zu einer anderen Anmelde-URL in ASP.NET MVC6 umzuleiten
Meine Anmeldemethode für den Kontroller verfügt über ein Route
-Attribut, um die URL zu ändern.
[HttpGet]
[AllowAnonymous]
[Route("login")]
public IActionResult Login(string returnUrl = null)
{
this.ViewData["ReturnUrl"] = returnUrl;
return this.View();
}
Beim Versuch, auf eine nicht autorisierte Seite zuzugreifen, werde ich zur ungültigen URL weitergeleitet. Es sollte nur
/login
sein, aber stattdessen.http://localhost/Account/Login?ReturnUrl=%2Fhome%2Findex
Ich habe den Cookie-Authentifizierungspfad wie folgt konfiguriert:
services.Configure<CookieAuthenticationOptions>(opt =>
{
opt.LoginPath = new PathString("/login");
});
Ich habe einen Standardfilter hinzugefügt, um sicherzustellen, dass alle URLs standardmäßig eine Authentifizierung erfordern.
services.AddMvc(
options =>
{
options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
});
Ich habe überprüft, dass die URL /login
tatsächlich die Anmeldeseite lädt, während /account/login
nicht wie erwartet funktioniert.
edit: Ich habe die Routen so belassen wie sie sind (abgesehen von der Änderung des Standardcontrollers und der Aktion)
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Site}/{action=Site}/{id?}");
});
Wenn Sie die UseIdentity
-Erweiterungsmethode hier aktivieren, werden Sie feststellen, dass IdentityOptions
nicht CookieAuthenticationOptions
verwendet wird. Daher müssen Sie IdentityOptions
konfigurieren:
services.Configure<IdentityOptions>(opt =>
{
opt.Cookies.ApplicationCookie.LoginPath = new PathString("/login");
});
Bearbeiten
Für asp.net core 2.0: Identitäts-Cookie-Optionen sind nicht mehr Bestandteil von IdentityOptions. Überprüfen Sie mxmissile's answer .
Mit asp.net core 2.0
jetzt hat sich dies geändert in:
services.ConfigureApplicationCookie(options => options.LoginPath = "/Account/LogIn");
Mehr zu hier auf 2.0 migrieren . Und noch mehr Informationen zur Migration von 2.0 nach 2.1.
UPDATE: Seit dot net core 2.1.x wird Identity aus dem SDK gerahmt . Um die @mxmissile-Antwort mitzuzeichnen, kann der Pfad angegeben werden. Um einen Trickpfad abzubilden, kombinieren Sie ihn mit erweitertem Routing oder Weiterleitungen. Scaffold Identity
Möglicherweise möchten Sie auch StatusCodePages
verwenden:
app.UseStatusCodePages(async context => {
var response = context.HttpContext.Response;
if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
response.StatusCode == (int)HttpStatusCode.Forbidden)
response.Redirect("/Error/Unauthorized");
});
Ich würde die Lösung von Serj Sagan in einem realen Beispiel nicht empfehlen. Dies würde beim Entwickeln perfekt funktionieren, aber für eine echte Anwendung, die von verschiedenen Benutzertypen verwendet wird, was irreführend sein könnte. Schauen wir uns das Szenario unten an
Dies bedeutet, dass ich zur Anmeldeseite weitergeleitet werde, als wäre ich nicht authentifiziert, was nicht der Fall ist. Ich würde mehr mit mxmissile lösung gehen
Ich persönlich benutze AddMvcCore, aber Sie müssen AddRazorViewEngine hinzufügen, wenn Sie Rasierapparate verwenden, und AddRazorPages, wenn Sie Rasiermesserseiten verwenden
services.AddMvcCore(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
})
.AddRazorViewEngine()
.AddAuthorization()
.AddJsonFormatters();
Sie müssen dies in startup.cs konfigurieren, wenn Sie den Authentifizierungsdienst hinzufügen, insbesondere wenn Sie ein Cookie-Authentifizierungsschema verwenden.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = new PathString("/login");
});
So habe ich das Problem gelöst, du solltest es ausprobieren ... Es wird definitiv für dich funktionieren
Seit asp.net core 2.0
, wenn Sie Cookies ohne Identität verwenden:
app.UseAuthentication();
// If you don't want the cookie to be automatically authenticated and assigned HttpContext.User,
// remove the CookieAuthenticationDefaults.AuthenticationScheme parameter passed to AddAuthentication.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/LogIn";
options.LogoutPath = "/Account/LogOff";
});