Y a-t-il un navigateur équivalent à ClearAuthenticationCache D'IE?

j'ai ici quelques applications Web internes .net qui exigent que les utilisateurs" se déconnectent " d'eux. Je sais que cela peut sembler discutable sur une application Intranet, mais néanmoins, il est là.

nous utilisons L'authentification Windows pour nos applications Intranet, donc nous nous connectons à notre Active Directory avec une authentification de base et les informations d'authentification sont stockées dans le cache du navigateur, par opposition à un cookie lors de l'utilisation de l'authentification .net forms.

dans IE6+ vous pouvez tirer parti d'une fonction JavaScript spéciale Qu'ils ont créé en faisant ce qui suit:

document.execCommand("ClearAuthenticationCache", "false")

Cependant, pour les autres navigateurs qui doivent être pris en charge (à savoir Firefox en ce moment, mais je m'efforce de prendre en charge plusieurs navigateurs), Je n'affiche que le message à l'utilisateur qu'il doit fermer son navigateur pour se déconnecter de l'application, ce qui élimine efficacement le cache de l'application.

est-ce que quelqu'un connaît certaines commandes/hacks/etc. que je peux utiliser dans d'autres navigateurs pour vider le cache d'authentification?

23
demandé sur Chris 2008-08-28 03:34:19

7 réponses

j'ai trouvé une solution qui semble assez cohérente, mais qui est hacky et Je ne suis toujours pas heureux avec elle .

cela fonctionne cependant: -)

1) redirigez-les vers une page D'ouverture de session

2) sur cette page lancer un script pour charger une autre page avec des références factices (exemple en jQuery):

$j.ajax({
    url: '<%:Url.Action("LogOff401", new { id = random })%>',
    type: 'POST',
    username: '<%:random%>',
    password: '<%:random%>',
    success: function () { alert('logged off'); }
});

3) qui devraient toujours revenir 401 la première fois (pour forcer les nouveaux pouvoirs à passer) et ensuite n'accepter que les références factices (exemple dans MVC):

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOff401(string id)
{
    // if we've been passed HTTP authorisation
    string httpAuth = this.Request.Headers["Authorization"];
    if (!string.IsNullOrEmpty(httpAuth) &&
        httpAuth.StartsWith("basic", StringComparison.OrdinalIgnoreCase))
    {
        // build the string we expect - don't allow regular users to pass
        byte[] enc = Encoding.UTF8.GetBytes(id + ':' + id);
        string expected = "basic " + Convert.ToBase64String(enc);

        if (string.Equals(httpAuth, expected, StringComparison.OrdinalIgnoreCase))
        {
            return Content("You are logged out.");
        }
    }

    // return a request for an HTTP basic auth token, this will cause XmlHttp to pass the new header
    this.Response.StatusCode = 401; 
    this.Response.StatusDescription = "Unauthorized";
    this.Response.AppendHeader("WWW-Authenticate", "basic realm=\"My Realm\""); 

    return Content("Force AJAX component to sent header");
}

4) Maintenant la chaîne de caractères aléatoire a été acceptée et mise en cache par le navigateur à la place. Quand ils visitent une autre page il essayera de les utiliser, échouera, et ensuite demandera pour les bons.

11
répondu Keith 2017-05-23 12:25:34

Mozilla implémente l'objet crypto, disponible via L'objet DOM window , qui a la fonction logout (Firefox 1.5 upward) pour effacer L'état de session SSL au niveau du navigateur de sorte que" la prochaine opération privée sur n'importe quel token nécessitera à nouveau le mot de passe de l'utilisateur "(voir this ).

l'objet crypto semble être une implémentation de la web Crypto API , et selon ceci document , L'API DOMCrypt ajoutera encore plus de fonctions.

comme indiqué ci-dessus Microsoft IE (6 upward) a: document.execCommand("ClearAuthenticationCache", "false")

Je n'ai trouvé aucun moyen de vider le cache SLL dans Chrome (voir this and this bug reports).

dans le cas où le navigateur ne propose pas D'API pour faire cela, je pense que le mieux que nous puissions faire est de demander à l'utilisateur de fermer le navigateur.

Voici ce que je fais:

var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") !== -1) {
    document.execCommand("ClearAuthenticationCache","false");
}
//window.crypto is defined in Chrome, but it has no logout function
else if (window.crypto && typeof window.crypto.logout === "function"){
    window.crypto.logout();
}
else{
    window.location = "/page/to/instruct/the/user/to/close/the/browser";
}
6
répondu staromeste 2012-02-25 15:55:04

quelques notes. Quelques personnes ont dit que vous devez lancer une demande ajax avec des justificatifs d'identité invalides pour obtenir le navigateur pour déposer ses propres justificatifs d'identité.

c'est vrai, mais comme Keith l'a souligné, il est essentiel que la page serveur prétend accepter ces informations pour que cette méthode fonctionne de manière cohérente.

sur une note similaire: il N'est pas suffisant que votre page affiche la boîte de dialogue de connexion via une erreur 401. Si l'utilisateur annule hors de la boîte de dialogue alors leurs justificatifs d'identité mis en cache ne sont pas affectés.

aussi si vous pouvez s'il vous plaît poke MOZILLA à https://bugzilla.mozilla.org/show_bug.cgi?id=287957 pour ajouter un correctif approprié pour FireFox. Un bug webkit a été enregistré à https://bugs.webkit.org/show_bug.cgi?id=44823 . IE met en œuvre une solution pauvre mais fonctionnelle avec la méthode:

document.execCommand("ClearAuthenticationCache", "false");

Il est regrettable que nous devons aller à ces longueurs juste pour déconnecter un utilisateur.

5
répondu AnthonyVO 2011-12-14 14:48:28

pourquoi ne pas utiliser FormsAuth, mais plutôt contre ActiveDirectory comme dans ce thread . Il est tout aussi sûr que L'authentification de base, mais se déconnecter est simplement une question de désactiver un cookie (ou plutôt, appeler FormsAuthentication.SignOut )

2
répondu Duncan Smart 2017-05-23 11:46:37

j'ai cherché une solution similaire et je suis tombé sur un patch pour Trac (un système de gestion des problèmes) qui fait cela.

j'ai regardé le code (et je suis fatigué, donc je n'explique pas tout); fondamentalement, vous devez faire un appel AJAX avec invalidité garantie justificatifs d'identité à votre page de connexion . Le navigateur obtiendra un 401 et sait qu'il doit vous demander les bons justificatifs d'identité la prochaine fois que vous y allez. Vous utilisez AJAX au lieu d'une redirection de sorte que vous pouvez spécifier des informations d'identification incorrectes et le navigateur ne popup Pas une boîte de dialogue.

sur le patch ( http://trac-hacks.org/wiki/TrueHttpLogoutPatch ) page ils utilisent très rudimentaire AJAX; quelque chose de mieux comme jQuery ou Prototype, etc. est probablement mieux, bien que ce fait le travail.

2
répondu Marius Marais 2009-09-10 19:03:57

espérons que cela sera utile jusqu'à ce que quelqu'un vienne réellement avec une réponse explicite - cette question a été discutée il y a deux ans sur un babillard électronique .

HTH

0
répondu Jason Bunting 2008-08-27 23:41:07

Eh bien, j'ai parcouru Bugzilla pendant un peu maintenant et apparemment la meilleure façon d'effacer l'authentification serait d'envoyer des justificatifs non existants.

pour en savoir plus: https://bugzilla.mozilla.org/show_bug.cgi?id=287957

0
répondu Andy 2008-08-27 23:44:54