36 votes

ASP.NET de base, changement de redirection par défaut pour les non autorisée

Je cherche à rediriger vers une autre url de connexion dans ASP.NET MVC6

Mon compte contrôleur de la méthode d'identification a un Route de l'attribut à modifier l'url.

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

Lorsque vous tentez d'accéder à un unathorized page, je suis redirigé vers l'url non valide, il faut juste être /login mais au lieu de cela je obtenir http://localhost/Account/Login?ReturnUrl=%2Fhome%2Findex

J'ai configuré l'authentification par cookie chemin d'accès comme suit:

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

J'ai ajouté un filtre par défaut, pour s'assurer que toutes les url d'exiger l'authentification par défaut.

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

J'ai vérifié que l'url /login n'en fait charger la page de connexion, tout en /account/login n'est pas, comme prévu.

edit: j'ai laissé les routes de l'est, (en dehors de changer la valeur par défaut du contrôleur et de l'action)

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

55voto

mxmissile Points 4179

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

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

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

20voto

tmg Points 11776

Si vous cochez UseIdentity méthode d'extension ici , vous remarquerez que c'est à l'aide de IdentityOptions pas CookieAuthenticationOptions, donc au lieu de cela, vous devez configurer IdentityOptions:

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

Modifier

Pour asp.net core 2.0: L'identité options de témoins ne font plus partie de IdentityOptions. Vérifier mxmissile de réponse.

6voto

daviesdoesit Points 183

Mise à JOUR: Comme de dot net de base 2.1.x, l'Identité est échafaudée à partir du SDK. À la co--signe @mxmissile réponse, le chemin peut être spécifié. Pour retirer un truc chemin, combiner avec le routage avancé ou redirections.Échafaudage Identité

6voto

Serj Sagan Points 2731

Vous pouvez également 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");
});

0voto

Aktorius Points 70

Je ne recommanderais pas de Serj Sagan solution dans un exemple réel. Cela fonctionne parfaitement lorsque le développement, mais pour une application réelle utilisée par différents types d'utilisateurs qui pourrait être trompeuse. Permet de regarder le scénario ci-dessous

  1. Je suis authentifié utilisé
  2. Je sais que l'url d'une page spécifique
  3. Je ne suis pas autoriser à accéder à des pages

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

Personnellement je suis en utilisant le AddMvcCore mais vous devez ajouter AddRazorViewEngine si vous utilisez un rasoir points de vue et AddRazorPages si vous utilisez un rasoir pages

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X