Je sais que ce sujet est ancien, mais je vais vous présenter une autre approche que j'ai trouvée et décrite précédemment. aquí . En fait, j'utilise ASP.MVC avec WIF. (mais ce n'est pas vraiment important dans le contexte de ce sujet - la réponse est adéquate quel que soit le cadre utilisé. L'indice reste inchangé - traiter les problèmes liés aux échecs d'authentification lors de l'exécution de requêtes ajax) .
L'approche présentée ci-dessous peut être appliquée d'emblée à toutes les requêtes ajax (si elles ne redéfinissent pas l'événement beforeSend évidemment).
$.ajaxSetup({
beforeSend: checkPulse,
error: function (XMLHttpRequest, textStatus, errorThrown) {
document.open();
document.write(XMLHttpRequest.responseText);
document.close();
}
});
Avant toute requête ajax CheckPulse
est invoquée (la méthode du contrôleur qui peut être la plus simple) :
[Authorize]
public virtual void CheckPulse() {}
Si l'utilisateur n'est pas authentifié (le jeton a expiré), il ne peut pas accéder à cette méthode (protégée par Authorize
attribut). Comme le framework gère l'authentification, lorsque le jeton expire, il met le statut http 302 à la réponse. Si vous ne voulez pas que votre navigateur traite la réponse 302 de manière transparente, attrapez-la dans Global.asax et changez le statut de la réponse - par exemple en 200 OK. De plus, ajoutez un en-tête, qui vous indique de traiter cette réponse d'une manière spéciale (plus tard, côté client) :
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302
&& (new HttpContextWrapper(Context)).Request.IsAjaxRequest())
{
Context.Response.StatusCode = 200;
Context.Response.AddHeader("REQUIRES_AUTH", "1");
}
}
Enfin, du côté client, on vérifie la présence d'un tel en-tête personnalisé. S'il est présent, une redirection complète vers la page de connexion doit être effectuée (dans mon cas window.location
est remplacée par l'url de la requête qui est gérée automatiquement par mon framework).
function checkPulse(XMLHttpRequest) {
var location = window.location.href;
$.ajax({
url: "/Controller/CheckPulse",
type: 'GET',
async: false,
beforeSend: null,
success:
function (result, textStatus, xhr) {
if (xhr.getResponseHeader('REQUIRES_AUTH') === '1') {
XMLHttpRequest.abort(); // terminate further ajax execution
window.location = location;
}
}
});
}
1 votes
(pas une réponse en tant que telle) - J'ai fait cela dans le passé en modifiant la bibliothèque jquery et en ajoutant une vérification de la page de connexion à chaque XHR complet. Ce n'est pas la meilleure solution car il faudrait le faire à chaque mise à jour, mais cela résout le problème.
1 votes
Voir la question connexe : stackoverflow.com/questions/5941933/
0 votes
En
HttpContext.Response.AddHeader
et vérifier le succès d'ajaxsetup est la voie à suivre.5 votes
Pourquoi le serveur ne renvoie pas 401 ? Dans ce cas, vous pouvez avoir un $.ajaxSetup global et utiliser le code d'état pour rediriger la page.
1 votes
Ce lien doanduyhai.wordpress.com/2012/04/21/ me donne la bonne solution