1
votes

Remplacer le routage dans ASP.NET CORE 2.2 pour router implicitement vers une zone si l'utilisateur dispose de certaines autorisations

Je recherche un moyen simple de modifier un peu le comportement de routage et d'ajouter des données de zone supplémentaires dans les données de route si l'utilisateur dispose de certaines autorisations.

Disons que pour un utilisateur normal, l'URL site / shop / 12 doit être redirigée vers ShopController

mais pour l'administrateur, il doit être acheminé vers AdminArea/ShopController


S'il vous plaît, considérez que cette question ne concerne pas la redirection HTTP, mais l'extension de l'infrastructure au niveau du framework pour permettre des fonctionnalités supplémentaires sur le routage ou l'invocation de contrôleur


0 commentaires

3 Réponses :


0
votes

Ajoutez une logique à la méthode du contrôleur qui gère site / shop / 12 pour vérifier si l'utilisateur est un administrateur, et si c'est le cas, redirigez-vous vers la zone d'administration et le contrôleur appropriés.

var isAdmin = IsUserAnAdmin();

if (isAdmin) {

    // This will redirect to the Index method defined in the ShopController
    // in the area name AdminArea
    return RedirectToAction("Index", "Shop", new { Area = "AdminArea" });

}


2 commentaires

Bien sûr, je ne veux pas faire cela pour éviter la redirection explicite. Le problème est de résoudre ce problème avec le routage.


Le routage est très strict dans le framework ASP .NET Core. Si vous voulez gérer cela avec le routage, vous devrez passer par la voie du middleware de routage: azurecoder.net/2017/07/09/routing-middleware-custom-irouter



0
votes

Je pense que le meilleur moyen est de définir les URL correctes sur le front-end, puis de valider la demande sur le point final en faisant quelque chose comme ceci:

        [HttpGet]
        [Route("v1.0/download/document")]
        public IActionResult download_document(int id, string token)
        {
            try
            {
                if (token == null || isNotAdmin(token))
                    return Unauthorized();

De cette façon, votre extrémité- les points sont protégés et vous évitez les redirections. De plus, à mon avis, tout a beaucoup plus de sens sur le front-end


0 commentaires

1
votes

Vous pouvez utiliser Intergiciel de réécriture d'URL pour rediriger la demande de l'utilisateur Admin

1.Créez une règle de redirection:

app.UseAuthentication();//before the Rewriter middleware

app.UseRewriter(new RewriteOptions()
            .Add(RewriteRules.RedirectRequests)
            );

2.Utilisez l'intergiciel dans la méthode Startup Configure :

public class RewriteRules
{
    public static void RedirectRequests(RewriteContext context)
    {
        //Your logic
        var IsAdminRole = context.HttpContext.User.IsInRole("Admin");
        if (IsAdminRole)
        {
            var request = context.HttpContext.Request;
            string area = "AdminArea";
            var path = request.Path.Value;

            //Add your conditions of redirecting
            if(path.Split("/")[1] != area)// If the url does not start with "/AdminArea"
            {
                context.HttpContext.Response.Redirect($"/{area}{ request.Path.Value }");
            }                          
        }
    }
}


0 commentaires