it-swarm.com.de

ASP.NET-Kern: Ändern Sie die Standardumleitung für nicht autorisierte Personen

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?}");
});
16
Jim

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 .

11
tmg

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.

28
mxmissile

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

5
daviesdoesit

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");
});
4
Serj Sagan

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

  1. Ich werde authentifiziert verwendet
  2. Ich kenne die URL für eine bestimmte Seite
  3. Ich bin nicht berechtigt, auf diese Seiten zuzugreifen

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();
1
Aktorius

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

1
Stephen Enunwah

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

Quelle

0
Stas Boyarincev