Déconnexion d'un utilisateur lors de L'utilisation de L'authentification HTTP Basic

je veux que les utilisateurs puissent se connecter via les modes D'authentification HTTP Basic.

le problème est que je veux aussi qu'ils soient en mesure de se déconnecter à nouveau - weirdly navigateurs juste ne semblent pas soutenir que.

c'est considéré comme un utilisateur de risque de piratage social-laisse leur machine déverrouillée et leur navigateur ouvert et quelqu'un d'autre peut facilement visiter le site comme eux. Notez que la fermeture du navigateur, onglet n'est pas assez pour réinitialiser le jeton, de sorte qu'il pourrait être une chose facile pour les utilisateurs à manquer.

donc j'ai trouvé une solution, mais c'est un total cludge:

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

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

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

3) qui devraient toujours retourner 401 la première fois (pour forcer les nouvelles lettres de créance à passer) et ensuite n'accepter que les fausses lettres de créance:

[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.

notez que mes exemples de code utilisent jQuery et ASP.Net MVC, mais la même chose devrait être possible avec n'importe quelle pile technologique.

il y a une autre façon de faire ceci dans IE6 et au-dessus:

document.execCommand("ClearAuthenticationCache");

toutefois que efface toute" authentification 1519250920 " - ils se déconnectent de mon site et ils sont déconnectés de leur e-mail aussi. De sorte que c'est.

y a-t-il une meilleure façon de faire cela?

j'ai vu autres questions sur ce, mais ils sont de 2 ans est - il une meilleure façon maintenant dans IE9, FX4, Chrome etc?

S'il n'y a pas de meilleure façon de le faire, peut-on se fier à ce cludge? Être il y a un moyen de le rendre plus robuste?

22
demandé sur Community 2011-06-08 15:18:48

1 réponses

l'anser court est:

Il n'existe pas de procédure fiable pour réaliser une "déconnexion" en utilisant Authentification HTTP Basic ou Digest étant donné les implémentations actuelles d'auth basic.

une telle authentification fonctionne en demandant au client d'ajouter un en-tête Authorization à la demande.

Si pour une certaine ressource le serveur n'est pas satisfait des informations fournies (par exemple s'il n'y en a pas), il va responde avec un Code de statut" 401 non autorisé " et authentification de la demande. À cette fin, il fournira un en-tête WWW-Authenticate avec la réponse.

un client n'a pas besoin d'attendre un serveur demandant l'authentification. Il peut simplement fournir un en-tête autorisation basé sur un certain local hypothèses (p. ex. informations mises en cache de la dernière tentative réussie).

alors que votre approche "clearing" sur les informations d'authentification a de bonnes chances de travailler avec un large éventail de clients (notamment les navigateurs à large diffusion), il n'y a absolument aucune garantie qu'un autre client pourrait être "plus intelligent" et il suffit de discriminer les données d'authentification appropriées pour votre page "déconnexion" et toutes les autres pages du site cible.

vous reconnaîtrez un" problème " similaire avec l'utilisation d'une authentification basée sur un certificat côté client. Aussi longtemps qu'il n'y a pas de soutien explicite de la part des clients, vous pourriez se battre sur un terrain perdu.

donc, si" logoff " est un problème, passez à n'importe quelle authentification basée sur la session.

si vous avez accès à la mise en œuvre de l'authentification côté serveur, vous pourriez être en mesure de mettre en œuvre une fonctionnalité qui ne tiendra pas compte des informations d'authentification présentées avec l'en-tête Authorization (si toujours identique à ce qui a été présenté au cours de la "session courante) sur demande de votre niveau d'application code (ou fournir un certain " timout "après lequel tous les justificatifs d'identité seront demandés de nouveau), de sorte que le client demandera à l'utilisateur de fournir des" nouveaux " justificatifs d'identité (effectuer une nouvelle connexion).

2
répondu rpy 2016-03-02 15:48:04