ASP.NET boucle de redirection de connexion lorsque l'utilisateur n'est pas dans son rôle

je suis un peu dans une impasse avec la mise en œuvre des rôles dans ASP.NET MVC 5. J'essaie de me connecter en tant qu'utilisateur qui n'a pas un rôle requis pour accéder à la zone de l'application que j'essaie de rejoindre. Ce à quoi je m'attends dans ce scénario, c'est que je suis redirigé vers la page de connexion à nouveau, et le sera jusqu'à ce que j'entre un ensemble de justificatifs d'identité qui ont accès ou je navigue vers un autre secteur de l'application.

ce qui se passe réellement est que la demande semble aller dans une boucle de redirection de connexion, le débogage révèle que l'action de connexion est appelée plusieurs fois.

Voici l'action de connexion:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

il en résulte une erreur générée par IIS:

HTTP Error 404.15 - Not Found
The request filtering module is configured to deny a request where the query string is too long.

la chaîne de requête ressemble à ceci:

http://localhost/MyApplication/Account/Login?ReturnUrl=%2FMyApplication%2FAccount%2FLogin%3FReturnUrl%3D%252FMyApplication%252FAccount%252FLogin%253FReturnUrl%253D%25252FMyApplication%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FMyApplication%2525252FAccount%2525252FLogin%2525253FReturnUrl%2525253D%252525252FMyApplication%252525252FAccount%252525252FLogin%252525253FReturnUrl%252525253D%25252525252FMyApplication%25252525252FAccount%25252525252FLogin%25252525253FReturnUrl%25252525253D%2525252525252FMyApplication%2525252525252FAccount%2525252525252FLogin%2525252525253FReturnUrl%2525252525253D%252525252525252FMyApplication%252525252525252FAccount%252525252525252FLogin%252525252525253FReturnUrl%252525252525253D%25252525252525252FMyApplication%25252525252525252FAccount%25252525252525252FLogin%25252525252525253FReturnUrl%25252525252525253D%2525252525252525252FMyApplication%2525252525252525252FAccount%2525252525252525252FLogin%2525252525252525253FReturnUrl%2525252525252525253D%252525252525252525252FMyApplication%252525252525252525252FAccount%252525252525252525252FLogin%252525252525252525253FReturnUrl%252525252525252525253D%25252525252525252525252FMyApplication%25252525252525252525252FAccount%25252525252525252525252FLogin%25252525252525252525253FReturnUrl%25252525252525252525253D%2525252525252525252525252FMyApplication%2525252525252525252525252FAccount%2525252525252525252525252FLogin%2525252525252525252525253FReturnUrl%2525252525252525252525253D%252525252525252525252525252FMyApplication%252525252525252525252525252FAccount%252525252525252525252525252FLogin%252525252525252525252525253FReturnUrl%252525252525252525252525253D%25252525252525252525252525252FMyApplication%25252525252525252525252525252FAccount%25252525252525252525252525252FLogin%25252525252525252525252525253FReturnUrl%25252525252525252525252525253D%2525252525252525252525252525252FMyApplication%2525252525252525252525252525252FAccount%2525252525252525252525252525252FLogin%2525252525252525252525252525253FReturnUrl%2525252525252525252525252525253D%252525252525252525252525252525252FMyApplication%252525252525252525252525252525252F

le seul changement que j'ai fait en passant d'une solution de travail (bien que sans autorisation basée sur le rôle) à ma situation actuelle cassée est ajouter ce qui suit au-dessus du contrôleur où je suis redirigé sur une connexion réussie:

[Authorize(Roles = "Staff")]

comme je l'ai déjà dit, l'utilisateur dans lequel je me connecte n'est pas dans ce rôle, mais je m'attendrais à une saine, simple redirection vers Login, sans la boucle.

modifier: demandé bu @dima, les détails de l'autorisation appliquée par des filtres... J'ai ce qui suit:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }
}

Cependant, j'ai testé l'application avec et sans cette ligne en place et la boucle de redirection continue sans relâche.

8
demandé sur A. Murray 2014-04-16 14:37:54

2 réponses

bien que cette question soit ancienne, j'ai eu le même problème et j'ai trouvé une solution.

à l'origine, j'avais ajouté le même filtre AuthorizationAttribute, et je me suis retrouvé dans la même boucle. Je l'ai ensuite enlevé et j'ai commencé à ajouter l'attribut authorize aux contrôleurs individuels, et j'ai trouvé que la boucle infinie ne se produisait qu'en ajoutant l'attribut authorize à mon contrôleur d'origine. Il s'avère que mon HomeController s'appelait après mon AccountController .

Le Problème


dans mon _Layout.cshtml , j'appelais le suivant:

@Html.Action("LeftNav", "Home")

la page de mise en page aurait correctement rendu le corps, mais quand il est arrivé à cela, il frappait une méthode de contrôleur qui avait un attribut d'autorisation. Cela a provoqué la redirection vers le Account/Login .

ajoutant l'attribut AllowAnonymous à l'attribut LeftNav action résolu la question.

La Solution


assurez-vous que votre Login vue et layouts n'appellent aucune action qui ont un attribut d'autorisation.

depuis que j'ai découvert ceci, j'ai créé une mise en page personnalisée pour mes requêtes non autorisées afin d'éviter d'autres problèmes potentiels comme celui-ci.

12
répondu silencedmessage 2014-09-24 13:39:06

je travaillais sur le même exemple donné dans la question mais la réponse (marquée) donnée par @silencedmessage n'a pas pu résoudre Ma situation malgré que j'ai déconnecté tous les liens entre le contrôleur Home et le contrôleur Account et entre le contrôleur Account et la vue _layout . Si quelqu'un est confronté à la même situation que moi, je recommande d'ajouter l'étape suivante à la solution:

puisque le AuthorizeAttribute dans cet exemple même est appliqué globalement, toutes ses méthodes d'action sont sécurisées par défaut et ne permettent pas l'accès "anonyme". Dans cet exemple, l'attribut [AllowAnnonymous] n'est appliqué qu'à la méthode d'action de connexion [HttpGet] . Il n'est pas appliqué à [HttpPost] login ActionMethod et puisque AuthorizeAttribute est appliqué Globalement, il assure également la sécurisation de [HttpPost] login ActionMethod, donc [HttpPost] login ActionMethod n'est pas en cours d'exécution, et vous êtes redirigé vers [HttpGet] login ActionMethod à l'infini.

en ajoutant simplement [AllowAnnonymous] à [HttpPost] login Actionméthode résolu Ma situation.

J'espère que ça aidera.

0
répondu Jogi 2016-01-23 18:09:06