web-dev-qa-db-fra.com

Impossible de gérer la redirection 302 en ajax et pourquoi?

J'ai un serveur principal écrit en asp.net mvc en utilisant l'authentification par formulaire. Lorsque l'utilisateur n'est pas authentifié, le serveur envoie automatiquement une redirection 302 vers une action de connexion et renvoie une page de connexion.

Côté client, j'ai une liste d'articles. Cette liste n'est accessible qu'aux utilisateurs authentifiés. Sur la page, j'ai un bouton pour rafraîchir la liste en utilisant Ajax (fonction $ .ajax de jQuery).

Maintenant, mon problème est lorsque le ticket d'authentification expire et que l'utilisateur clique sur le bouton Actualiser:

  • Ma fonction envoie une requête ajax pour obtenir la liste actualisée
  • Le serveur détecte que le ticket d'authentification n'est pas valide et émet une redirection 302.
  • Le navigateur automatiquement gère cette réponse 302 et force ma fonction ajax à envoyer une autre demande ajax à l'action de connexion et le résultat final est un HTML avec le statut 200. Mon script est confus car la liste est aussi un HTML avec le statut 200.

Ce que je veux, c'est lorsque le ticket d'authentification expire et que l'utilisateur clique sur le bouton Actualiser, je devrais pouvoir le détecter et afficher un message demandant à l'utilisateur de se connecter.

J'ai essayé de contourner cela en ajoutant un en-tête personnalisé (IS_LOGIN) dans l'action de connexion et en vérifiant cela dans ma réponse ajax. Mais ce n'est pas une bonne solution.

Mes questions sont donc:

  • Quelle est la meilleure façon de résoudre ce problème?
  • Pourquoi le navigateur ne laisse-t-il pas notre script gérer la réponse 302? et force automatiquement notre ajax à créer une autre demande. C'est un problème avec le navigateur ou la bibliothèque jquery? Des raisons à cela? (Sécurité,...)

Merci pour toutes les réponses.

40
Khanh TO

Vous ne devez pas rediriger l'appel lorsqu'il s'agit d'un XHR mais répondre par un 401 Unauthorized et gérez cela dans vos rappels. Je ne connais pas ASP.NET mais j'ai fait quelque chose de similaire avec Spring Security.

Voici le concept:

  • Obtenez l'état authentifié
  • Vérifiez les en-têtes pour X-Requested-With: XMLHttpRequest
  • Une fois trouvé et non authentifié, répondez par 401 Unauthorized
  • Redirection non trouvée et non authentifiée.

L'essentiel est que les appels XHR doivent être traités différemment des autres requêtes HTTP dans certains cas. Vous ne devez rediriger un XHR que si la même ressource se trouve à un autre emplacement.

Pour répondre à ta question

Vous ne pouvez pas gérer les redirections avec les rappels XHR car le navigateur s'en charge automatiquement. Vous ne récupérerez que ce à l'emplacement redirigé.

39
Bart