Transparent session de l'utilisateur sur plusieurs sites (single sign-on + single sign-off)
J'ai plusieurs sites dans différents domaines: example.com
, example.org
, mail.example.com
et passport.example.org
. Tous les sites sont communes look-and-feel et
doivent partager la même base d'utilisateurs.
Et, dans ce cas extrême, je veux encore tous les sites à de manière transparente (autant que possible)
partager les sessions de l'utilisateur avec la clé suivante propriétés:
-
Single sign-on. Lorsque l'utilisateur se connecte à
passport.example.org
et visites
tout autre site, il doit être traité comme connecté.Les utilisateurs connectés obtenir “Bonjour,
$username
“ salutation en-tête du site et les différents
menu de navigation, la liste des services auxquels ils ont accès. S'il n'est pas connecté, au lieu
salut il y a un “Signe” lien pointant verspassport.example.org/signon
.La liste des domaines de confiance est connu, donc c'est assez simple à mettre en œuvre, soit
avec OpenID ou avec certains homebrewn protocole léger. Lorsque l'utilisateur frappe d'abord l'
site, je suis rediriger lui spéciales d'authentification d'extrémité àpassport.example.org
,
qui est ensuite silencieusement le redirige en arrière, avec les informations d'identité (ou “non signé”
identité anonyme) inclus. Pour la plupart des navigateurs, il est complètement transparent.
Évidemment, je suis en utilisant le nonce les valeurs de lutte contre la redirection de boucles. -
Single sign-off. Lorsque l'utilisateur clique sur “sign off” dans l'en-tête de n'importe quel site
la prochaine fois qu'il visite votre site, il devrait être considéré comme “de ne pas signer”.OpenID n'a pas été conçu pour cela. Mon idée (j'ai déjà une partie de travail
la mise en œuvre) est à envoyer pas l'identité de l'utilisateur, mais “global” jeton de session et de partager
mondial des séances de table (global_session_token ↔ utilisateur de relation) en DB. -
Robots et cookieless-support aux usagers. Les Sites sont d'avoir des espaces publics, ce qui devrait
être accessible par l'utilisateur-agents, sans le support des cookies.De ce fait, la redirection je l'ai mentionné dans (1) devient un problème, parce que pour
chaque demande de page, je vais finir par jeter l'utilisateur de l'agent d'authentification d'extrémité et à l'arrière.
Non seulement cela permettra de confondre les robots, mais il va polluer ma session de base de données avec
morts à la naissance des séances très rapidement. Et je certainement ne voulez pas afficher “hey,
vous n'avez pas activé les cookies, éloignez-vous!” de la page, ce serait très impoli et
décevant. Alors que j'ai besoin de prise en charge de cookies pour la connexion, je veux que les utilisateurs librement lire
ce que les sites sont pour et ainsi de suite — sans aucune restriction.Et j'ai explicitement ne pas voulez mettre des Id de session dans les Url, sauf pour certains transparent
inter-domaine redirections je l'ai mentionné. Je crois que faire de telles est un problème de sécurité
et juste généralement une Mauvaise Chose.Et là, je suis presque à court d'idées.
Ok, je sais que c'est dur, mais Google en fait cela d'une certaine manière avec (google.com
,
google.
beaucoup de gtld, gmail.com
et ainsi de suite), à droite? Donc, cela devrait être
possible.
Je lui en serais reconnaissant pour le protocole de description des idées (qui serait le mieux) ou des liens
de systèmes (code pour lire ou tout simplement des sites pour regarder et apprendre à) déjà
mise en œuvre avec succès quelque chose comme ça.
Pour résumer: Plusieurs domaines, sans racine commune, partagée base d'utilisateurs, authentification unique (single sign-off, pas de cookies pour naviguer de façon anonyme.
Tous les sites sont sur le même réseau (mais reste sur des serveurs différents) et partiellement
partager la même base de données PostgreSQL (au repos dans les différents régimes de la même base de données).
La plupart des sites sont écrits en Python/Django, mais certains d'entre eux sont à l'aide de PHP et Ruby on Rails. Alors que je suis en train de penser à quelque chose de cadre et de la langue agnostique, je suis reconnaissant pour le pointage de toutes les implémentations. Même si je ne vais pas être en mesure de les utiliser, si je vais avoir l'idée de comment c'est fait il y a peut-être que je vais être capable de trouver la mise en œuvre de quelque chose de similaire.
- Non, il n'est pas difficile. C'est juste un truc, comme la carte-astuces. Une fois que vous savez comment, c'est facile. 🙂
Vous devez vous connecter pour publier un commentaire.
Eh bien, laissez-moi vous expliquer un peu plus loin. (Toutes les URLs sont fictifs!) Comme je l'ai dit, le visiteur va à http://www.yourwebpage.com et il indique qu'il veut se connecter. Il est redirigé vers http://your.loginpage.org?return=http://www.yourwebpage.com/Authenticated où il devra fournir son nom d'utilisateur et mot de passe.
Lorsque des informations de son compte est valide, il sera de retour à la page qui vous a été fourni dans l'URL de connexion, mais avec un paramètre supplémentaire qui sera utilisée comme IDENTIFIANT. Donc, il va à http://www.yourwebpage.com/Authenticated?ID=SharedSecret où SharedSecret serait une identité temporaire, valide pour 30 secondes ou moins.
Lorsque votre page d'authentification est appelée, la page serait alors appel à une méthode qui est partagé entre yourwebpage.com et loginpage.org pour rechercher des informations sur le compte de SharedSecret pour récupérer une base plus permanente, ID. Ce code est stocké dans la session web, de yourwebpage.com et ne doit JAMAIS être présentée à l'utilisateur.
La méthode partagée pourrait être n'importe quoi. Si les deux serveurs sont sur la même machine, ils pourraient tout à la fois accéder à la même base de données. Sinon, ils pourraient communiquer avec un autre serveur via des services web. Ce serait serveur-à-serveur de communication ainsi, il n'a pas d'importance si l'utilisateur est un robot ou n'a pas de prise en charge de cookies. Cette partie de ne pas être remarqué par l'utilisateur.
La seule chose que vous devrez faire face est la session de l'utilisateur. Normalement, les utilisateurs recevront un IDENTIFIANT de session est stocké dans un cookie, mais il peut aussi être une partie de l'URL dans le cadre d'une requête GET. C'est un peu plus sûr d'avoir l'ID de session à l'intérieur d'une requête POST, bien que, par l'ajout d'un champ caché de votre formulaire.
Heureusement, plusieurs langages de développement web ne fournissent déjà session de prise en charge de sorte que vous n'avez même pas à vous soucier de maintien des sessions et de l'envoi de l'ID de session du. La technique est intéressante, même si. Et vous devez être conscient que les sessions devraient toujours être temporaire, puisqu'il y a un risque que l'ID de session de l'obtenir détourné.
Si vous avez à traiter avec plusieurs sites dans différents domaines, alors vous aurez besoin de travailler sur certains serveur-à-serveur de communication. Le plus simple serait de les laisser partager la même base de données, mais il est préférable de construire un service web autour de cette base de données, pour une protection supplémentaire. Assurez-vous que ce service web accepte uniquement les demandes de vos propres domaines juste pour ajouter encore un peu plus de protection.
Lorsque vous avez de serveur à serveur de connexions, alors l'utilisateur sera en mesure de basculer entre vos domaines et aussi longtemps que vous êtes de passage le long d'un ID de session pour le nouveau nom de domaine, l'utilisateur sera connecté. Si l'utilisateur utilise des cookies, c'est pas très probable que la session est perdue qui aurait besoin de se connecter à nouveau. Sans témoins, il y a une chance que l'utilisateur devra se connecter à nouveau pour obtenir un nouveau cookie si l'ID de session est perdu navigation entre les pages. (Par exemple, le visiteur va visiter Google et puis s'en va vers votre site. Avec un cookie de session peut être lu à partir du cookie. Sans un cookie de la session est perdue depuis que Google ne passera pas l'ID de session vers l'avant.
Ne gardez à l'esprit que transmettre l'ID de session est entre différents domaines est un risque pour la sécurité. L'ID de session peut être détourné, rendant ainsi possible pour quelqu'un d'autre à usurper l'identité de votre visiteur. Par conséquent, l'ID de session doit être de courte durée et d'obfuscation. Mais même si un pirate accède à un ID de session, il ne veut toujours pas d'un accès complet au compte de lui-même. Il ne sera pas en mesure d'intercepter le serveur-à-serveur de communication, de sorte qu'il ne peut pas accéder à la base de données avec vos informations d'utilisateur, à moins qu'il va à la page de connexion directement.
Autant que je sache, Google utilise un cookie pour l' "Google.com" domaine. Mais Google utilise également OpenID qui permet pour un générique mécanisme de connexion. Fondamentalement, cela fonctionne en vous redirigeant vers un spécial page de connexion. Cette page de connexion s'détecter si vous êtes connecté ou non et si vous ne l'êtes pas, il va vous demander de vous connecter. Sinon, c'est juste vous redirige directement vers la page suivante.
Donc, dans votre cas, un utilisateur a ouvert somepage.example.com et la session de cette application n'a pas d'ID de connexion. Il serait donc rediriger l'utilisateur vers d'ouverture de session.exemple.biz où l'utilisateur va se connecter dans. Derrière cette page serait également une session et de la session serait dire que l'utilisateur est déjà connecté. (Ou pas, auquel cas l'utilisateur doit se connecter en premier.) Ensuite, il redirige l'utilisateur somepage.exemple.com?sessionid=quelque chose où cette sessionid devraient être stockées dans la session de somepage.example.com. Alors cette session permettra aussi de savoir que l'utilisateur a ouvert une session et pour l'utilisateur, il aurait presque l'impression d'être transparent.
En réalité, l'utilisateur est redirigé deux fois.
Êtes-vous à l'aide de ASP.NET? Si oui, vous voulez avoir un coup d'oeil à la enableCrossAppRedirects de la propriété.
Pour cette solution, pas besoin de passeport serveur.
Signin
Autorisation par cookie
Signe
Je suis ne peut pas essayer cette solution. Mais maintenant, j'ai le même problème que vous (SSO) et j'ai essayer cela demain.
Si toutes vos applications sur un domaine, alors il n'est pas trop difficile parce que vous pouvez utiliser un niveau de domaine du cookie pour gérer la session de contrôle. (Cookie de session de moins de gestion est difficile, mais peut être fait, mais c'est difficile.)
Toutefois, vous avez indiqué que certains sites sur le example.com domaine, et certains sur la example.org domaine.
En jouant un peu avec mon google soupir, et d'autres sites de la leur orkut.com il ressemble quand vous appuyez sur une page qui a besoin d'informations d'identification, il vous redirige vers un site commun pour compte, qui puis vous redirige sur le site original, sans doute en passant une sorte de jeton de session dans l'URL. À partir de cela, on suppose que le orkut.com serveurs de conférer directement avec le google.com serveurs pour vérifier le jeton et obtenir ce que d'autres renseignements de l'utilisateur est nécessaire.
Plus d'Infos Sur le Domaine au Niveau des Témoins de la Reqeusted
Si vous avez deux sites, dire
foo.example.com
etbar.example.com,
vous pouvez définir un cookie spécifique à l'hôte, mais vous pouvez également définir un cookie pour le domaine qui sera vu par tous les hôtes sur le domaine.Donc,
foo.example.com
peut placer un cookie pourfoo.example.com
plus précisément, et il ne sera visible que par lui-même, mais il peut également définir un cookie pour le domaineexample.com,
et lorsque l'utilisateur passe àbar.example.com
ils pourront également voir cette deuxième biscuit.Toutefois, si vous aussi vous avez un site,
snafu.example.org,
il ne peut pas voir à ce niveau de domaine du cookie quefoo
, parce queexample.org
etexample.com
sont deux domaines totalement différents.Vous pouvez utiliser le niveau de domaine du cookie pour conserver les informations de session dans l'ensemble des sites dans le même domaine.
Comment vous définissez domaine niveau des cookies dépend de votre environnement de développement (je n'ai aucune expérience avec des rails, désolé).
J'ai utilisé shibboleth, pour les deux SSO scénarios et de l'Identité Fédérée, mais je suppose que vous avez besoin de plus des solutions simples que mentionné ci-dessus.
Une croix de domaine capable rails plugin pour faire ce serait génial.
J'aimerais le faire, la seule façon que je pouvais penser était de forcer l'utilisateur à télécharger une barre d'outils, ou un peu d'air app qui permettrait de gérer la journalisation automatique pour moi.
J'aimerais savoir d'une autre manière parce que les coups