web-dev-qa-db-fra.com

Utilisation de l'URL de retour dans le noyau asp.net

Nous essayons de rediriger l'utilisateur (en utilisant l'URL de retour) vers la page de connexion si l'utilisateur n'est pas authentifié/autorisé lors de l'accès à l'URL particulière. Cependant, nous ne sommes pas en mesure d'ajouter les paramètres personnalisés (nom du client dans ce cas) en route lors de la redirection de l'utilisateur vers la page de connexion. Nous utilisons le cadre principal de l'identité asp.net.

Dans Startup.cs nous avons défini l'itinéraire ci-dessous qui sera applicable à tous.

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "Edge",
                    template: "{clientname}/{controller}/{action}");
            });

également ajouté sous la ligne de code pour garantir que toutes les URL nécessitent une authentification

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

et configuré le IdentityOptions pour la redirection vers la page de connexion comme suit

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

et dans le contrôleur de compte ci-dessous est la méthode de connexion

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

Si l'utilisateur essaie d'accéder à une URL sans authentification, il doit rediriger vers la page de connexion. Considérez ci-dessous la méthode d'indexation de Home Controller comme exemple.

public IActionResult Index()
{
    return View();
}

Mais chaque fois que nous essayons de rediriger l'utilisateur vers la page de connexion, il n'ajoute pas le nom du client dans l'URL. Il se forme sous l'URL où le nom du client est manquant dans /Account/Login

http://localhost:5002/Account/Login?ReturnUrl=/ClientA/home/index

Pour cette raison, cela entraîne une erreur de page 404 introuvable. Quels changements devons-nous faire pour une redirection correcte?.

L'URL doit être formée comme suit

http://localhost:5002/ClientA/Account/Login?ReturnUrl=/ClientA/home/index
6
XamDev

Vous définissez spécifiquement le LoginPath sur vos options d'authentification. Par défaut, il vous y dirigera toujours lorsque vous n'êtes pas authentifié, quelle que soit la ressource que vous avez essayé d'atteindre. Je crois que vous devrez peut-être remplacer ou hériter/remplacer certains des entrailles afin que le LoginPath soit dynamique en fonction de la ressource que vous demandez. Je ne sais pas si les LoginPath dynamiques sont pris en charge nativement sinon? Je peux me tromper.

Sur une note de sécurité non liée, vous devez vérifier que la ressource dans ReturnUrl est locale à votre application avant d'essayer de l'utiliser, ou même retourner la page d'accueil de votre application. Sinon, il est possible qu'une URL mal formée usurpe l'emplacement de redirection vers une ressource conçue pour imiter la vraie en apparence, mais avec une intention malveillante.

if (Url.IsLocalUrl(returnUrl))
    return Redirect(returnUrl);
else
    return RedirectToAction("Index", "Home");
10
Nick Albrecht

Il semble qu'ils l'ont changé dans .Net Core MVC

Comment cela a fonctionné pour moi:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = "")
{
    ....... other codes

    if (!String.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
       return Redirect(returnUrl);
    else
       return RedirectToAction("Index", "Home");
}

Maintenant, passez au code HTML Razor:

@{
    ViewData["Title"] = "Login";
    Layout = "~/Views/Shared/_Layout.cshtml";
    var returnUrl = @Context.Request.Query["returnurl"];
}

<form asp-action="Login" asp-route-returnurl="@returnUrl">
   <!--Rest of your login page HTML -->
</form>

Et cela fonctionne bien maintenant!

7
Ali Adravi

vous pouvez utiliser Events pour obtenir la demande et rediriger vers l'URL que vous souhaitez comme cet exemple.

services.ConfigureApplicationCookie(options => {

            options.Events = new Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents
            {
                OnRedirectToLogin = ctx =>
                {
                    var requestPath = ctx.Request.Path;
                    if (requestPath.Value == "/Home/About")
                    {
                        ctx.Response.Redirect("/Home/UserLogin");
                    }
                    else if (requestPath.Value == "/Home/Contact")
                    {
                        ctx.Response.Redirect("/Home/AdminLogin");
                    }

                    return Task.CompletedTask;
                }
            };

        });

voir ce lien: Comment rediriger l'accès refusé à la connexion en fonction de l'URL sur l'identité ASP.NET Core 2?

1
MSL