La plupart des solutions proposées utilisent une solution de contournement, en utilisant un en-tête supplémentaire ou un code HTTP inapproprié. Ces solutions fonctionneront très probablement, mais elles sont un peu "bricolées". J'ai trouvé une autre solution.
Nous utilisons le WIF qui est configuré pour rediriger (passiveRedirectEnabled="true") sur une réponse 401. La redirection est utile pour traiter les requêtes normales mais ne fonctionne pas pour les requêtes AJAX (puisque les navigateurs n'exécutent pas le 302/redirect).
En utilisant le code suivant dans votre global.asax, vous pouvez désactiver la redirection pour les demandes AJAX :
void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e)
{
string requestedWithHeader = HttpContext.Current.Request.Headers["X-Requested-With"];
if (!string.IsNullOrEmpty(requestedWithHeader) && requestedWithHeader.Equals("XMLHttpRequest", StringComparison.OrdinalIgnoreCase))
{
e.RedirectToIdentityProvider = false;
}
}
Cela vous permet de renvoyer des réponses 401 pour les demandes AJAX, que votre javascript peut alors traiter en rechargeant la page. Le rechargement de la page renverra une réponse 401 qui sera traitée par le WIF (et le WIF redirigera l'utilisateur vers la page de connexion).
Un exemple de javascript pour gérer les erreurs 401 :
$(document).ajaxError(function (event, jqxhr, settings, exception) {
if (jqxhr.status == 401) { //Forbidden, go to login
//Use a reload, WIF will redirect to Login
location.reload(true);
}
});
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