35 votes

Session utilisateur transparente sur plusieurs sites (single sign-on + single sign-off)

J'ai plusieurs sites dans différents domaines : example.com , example.org , mail.example.com y passport.example.org . Tous les sites ont une apparence et une convivialité communes et devraient partager la même base d'utilisateurs.

Et dans ce cas extrême, je veux quand même que tous les sites de manière transparente (autant que possible) partager des sessions d'utilisateurs avec les propriétés clés suivantes :

  1. Authentification unique . Lorsque l'utilisateur se connecte à passport.example.org et visite tout autre site - il doit être considéré comme connecté.

    Les utilisateurs connectés obtiennent "Bonjour, $username " dans l'en-tête du site et différents menu de navigation, énumérant les services auxquels ils ont accès. S'il n'est pas connecté, au lieu de de l'accueil, il y a un lien "Sign on", qui pointe sur passport.example.org/signon .

    La liste des domaines de confiance est connue, ce qui rend la mise en œuvre assez simple. avec OpenID ou avec un protocole léger maison. Lorsque l'utilisateur visite le site pour la première fois je le redirige vers un endpoint d'authentification spécial à l'adresse suivante passport.example.org , qui le redirige ensuite silencieusement, avec les informations d'identité (ou l'identité anonyme "non signée"). identité anonyme). Pour la plupart des navigateurs, c'est complètement transparent. Évidemment, j'utilise des valeurs nonce pour lutter contre les boucles de redirection.

  2. Signature unique . Lorsque l'utilisateur clique sur "se déconnecter" dans l'en-tête de n'importe quel site la prochaine fois qu'il visite un site, il doit être considéré comme "non connecté".

    OpenID n'a pas été conçu pour cela. Mon idée actuelle (j'ai déjà une implémentation qui fonctionne partiellement) est la suivante partiellement fonctionnelle) est d'envoyer non pas l'identité de l'utilisateur, mais un jeton de session "global" et de partager la table des sessions globales (relation utilisateur global_session_token) dans la BD.

  3. Soutien aux robots et aux utilisateurs sans cuisson . Les sites ont des zones publiques, qui doivent être accessibles par les agents utilisateurs sans l'aide de cookies.

    Pour cette raison, la redirection que j'ai mentionnée dans (1) devient un problème, car pour chaque demande de page, je finirai par envoyer l'agent utilisateur vers le point de terminaison d'authentification et vice-versa. Non seulement cela perturbera les robots, mais cela polluera ma base de données de sessions avec des données sessions mortes à la naissance très rapidement. Et je n'ai absolument pas envie d'afficher "hey, vous n'avez pas activé les cookies, partez !", ce serait extrêmement impoli et décevant. décevant. Bien que j'aie besoin du support des cookies pour me connecter, je veux que les utilisateurs puissent lire librement ce à quoi servent les sites et ainsi de suite - sans aucune restriction.

    Et j'ai explicitement Ne le fais pas. ne veulent pas mettre les ID de session dans les URLs, sauf pour quelques transparentes transparentes entre domaines que j'ai mentionnées. Je pense que faire cela est un problème de sécurité et généralement une mauvaise chose.

    Et là, je suis presque à court d'idées.

Bon, je sais que c'est difficile, mais Google le fait en quelque sorte avec ( google.com , google. lotofgTLDs , gmail.com et ainsi de suite), n'est-ce pas ? Donc cela devrait être possible.

Je serais reconnaissant pour des idées de description de protocole (ce serait le mieux) ou des liens. vers des systèmes (soit du code à lire, soit des sites en direct à observer et à apprendre) qui ont déjà mis en œuvre avec succès quelque chose comme ça. déjà mis en œuvre avec succès quelque chose comme ça.

Pour résumer : Plusieurs domaines sans racine commune, base d'utilisateurs partagée, signature unique, signature unique, pas de cookies nécessaires pour naviguer anonymement.

Tous les sites sont sur le même réseau (mais reposent sur des serveurs différents) et partagent en partie la même base de données PostgreSQL (qui repose sur différents schémas de la même base de données). partagent la même base de données PostgreSQL (reposant dans les différents schémas de la même base de données). La plupart des sites sont écrits avec Python/Django, mais certains d'entre eux utilisent PHP et Ruby on Rails. Bien que je pense à quelque chose d'agnostique du point de vue du cadre et du langage, je serais reconnaissant de m'indiquer toute implémentation. Même si je ne suis pas en mesure de les utiliser, si je saisis l'idée de comment c'est fait, je serai peut-être en mesure de mettre en œuvre quelque chose de similaire.

0voto

Aggelos Biboudis Points 745

J'ai utilisé shibboleth, à la fois pour des scénarios de SSO et d'identité fédérée, mais je suppose que vous avez besoin de solutions plus simples que celles mentionnées ci-dessus.

-4voto

web strategy Points 1

Un plugin rails capable de faire cela sur plusieurs domaines serait génial.

J'aimerais le faire, mais le seul moyen auquel j'ai pensé est de forcer l'utilisateur à télécharger une barre d'outils ou une petite application aérienne qui s'occuperait de se connecter automatiquement à ma place.

J'aimerais connaître un autre moyen, parce que ça craint.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X