web-dev-qa-db-fra.com

ASP.NET Core, changer la redirection par défaut pour non autorisée

J'essaie de rediriger vers une autre URL de connexion dans ASP.NET MVC6

La méthode de connexion du contrôleur de mon compte a un attribut Route pour changer l’URL.

[HttpGet]
[AllowAnonymous]
[Route("login")]
public IActionResult Login(string returnUrl = null)
{
    this.ViewData["ReturnUrl"] = returnUrl;
    return this.View();
}

Lorsque j'essaie d'accéder à une page non approuvée, je suis redirigé vers l'URL non valide. Il doit s'agir simplement de /login mais je reçois plutôt.http://localhost/Account/Login?ReturnUrl=%2Fhome%2Findex

J'ai configuré le chemin d'authentification des cookies comme suit:

services.Configure<CookieAuthenticationOptions>(opt =>
{
    opt.LoginPath = new PathString("/login");
});

J'ai ajouté un filtre par défaut pour garantir que toutes les URL nécessitent une authentification par défaut.

services.AddMvc(
    options =>
    {
        options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
    });

J'ai vérifié que l'url /login charge effectivement la page de connexion, alors que /account/login ne le fait pas, comme prévu.

edit: J'ai laissé les routes telles quelles, (à part changer le contrôleur et l'action par défaut)

app.UseMvc(routes =>
{
    routes.MapRoute(
      name: "default",
      template: "{controller=Site}/{action=Site}/{id?}");
});
16
Jim

Si vous cochez la méthode d'extension UseIdentityici , vous remarquerez qu'elle utilise IdentityOptions et non CookieAuthenticationOptions; vous devez donc configurer IdentityOptions:

services.Configure<IdentityOptions>(opt =>
{
    opt.Cookies.ApplicationCookie.LoginPath = new PathString("/login");
});

Modifier

Pour asp.net core 2.0: Les options de cookie d’identité ne font plus partie de IdentityOptions. Vérifiez le méga réponse de mxmissile.

11
tmg

Avec asp.net core 2.0 maintenant, cela a changé en:

services.ConfigureApplicationCookie(options => options.LoginPath = "/Account/LogIn");

Plus sur migration vers la version 2.0 ici . Et encore plus d'informations sur la migration de la version 2.0 à la version 2.1.

28
mxmissile

UPDATE: À partir de Dot Net Core 2.1.x, l’identité est modifiée à partir du SDK . Pour co-signer la réponse @mxmissile, le chemin peut être spécifié. Pour créer un chemin artificiel, combinez-le avec un routage avancé ou des redirections. Scaffold Identity

5
daviesdoesit

Vous voudrez peut-être aussi essayer d'utiliser StatusCodePages:

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

Je ne recommanderais pas la solution Serj Sagan dans un exemple concret. Cela fonctionnerait parfaitement lors du développement, mais pour une application réelle utilisée par différents types d’utilisateurs, cela pourrait être trompeur. Regardons le scénario ci-dessous

  1. Je suis authentifié utilisé
  2. Je connais l'URL d'une page spécifique
  3. Je ne suis pas autorisé à accéder à ces pages

Cela signifie que je serais redirigé vers la page de connexion comme si je n'étais pas authentifié, ce qui n'est pas le cas. J'irais plus avec la solution mxmissile

Personnellement, j'utilise AddMvcCore mais vous devez ajouter AddRazorViewEngine si vous utilisez des vues rasoir et AddRazorPages si vous utilisez des pages rasoirs

        services.AddMvcCore(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .AddRazorViewEngine()
        .AddAuthorization()
        .AddJsonFormatters();
1
Aktorius

Depuis asp.net core 2.0 si vous utilisez des cookies sans identité:

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

la source

0
Stas Boyarincev