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?}");
});
Si vous cochez la méthode d'extension UseIdentity
ici , 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.
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.
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
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");
});
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
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();
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";
});