Comment créer un partage de Connexion de Service dans Plusieurs Domaines?
Je suis intéressé par la façon de mettre en œuvre un partage inter-domaine dans le système de connexion ainsi que les meilleures pratiques et les précautions de sécurité à prendre. Si vous êtes familier avec 37Signals, vous êtes probablement habitué à leur utilisation de disposer d'un universel commun mécanisme d'authentification laquelle vous n'avez pas par la suite de vous connecter si vous utilisez le haut niveau de navigation à un autre produit. Je voudrais mettre en place quelque chose d'une manière similaire.
La chose la plus proche que j'ai trouvé en ligne est l'entrée de Wikipedia sur un Central Authentication Service et la réponse à Croix Domaine de Connexion pour se connecter à un utilisateur automatiquement lorsque transférés à partir d'un domaine à un autre, qui peut être légèrement différent dans ce cas.
J'ai inspecté leurs cookies de session pour obtenir une prise sur ce qu'ils font dans le processus. Initialement, chaque lien du produit a un "goto" uristub, c'est à dire:
https://MY_COMPANY.campfirenow.com/id/users/[int_identifier]/goto
À l'aide de FireCookie et l'onglet réseau de Firebug, je suis en mesure de voir les cookies qui sont définies et les redirections qui se produisent dans le processus. Le goto
url feux d'une redirection 302 vers:
https://MY_COMPANY.basecamphq.com/login/authenticate?sig=[BASE64_ENCODED_AND_ENCRYPTED_DATA]
L'identifiant de session est recréé, le plus probable pour CSRF fins. Certaines des données dans les cookies ainsi que le paramètre GET sig ont été partiellement déchiffrée à l'aide de base64_decode à la suivante:
//sig GET param
array(2) {
[0]=>
���ף�:@marshal_with_utc_coercionT7�z��<k��kW"
[1]=>
string(18) "���k�<kn8�f���to��"
}
//_basecamp_session cookie session param
string(247) {
:_csrf_token"1Sj5D6jCwJKIxkZ6oroy7o/mYUqr4R5Ca34cOPNigqkw=:session_id"%060c0804a5d06dafd1c5b3349815d863"
flashIC:'ActionController::Flash::FlashHash{:
@used{: auth{"
MY_COMPANY{:
user_idi�3
:identity_idi�W����������s�]��:�N[��:
߾�����"
L'encodage, c'est de casser le bloc de code. Merci pour votre aide!
- Serait un pré-emballés partagée service de connexion comme OpenID, Facebook, OAuth ou Google pour vous? Ou, avez-vous absolument besoin de votre propre partagée service de connexion?
Vous devez vous connecter pour publier un commentaire.
Je pense que la clé dans votre Q est l'endroit où vous écrivez "en vertu de laquelle vous n'avez pas par la suite de vous connecter si vous utilisez le haut niveau de navigation à un autre produit".
Je vais vous expliquer:
Vous voulez être en mesure de passer de site1.com pour site2.com et laissez site2.com savoir que vous êtes utilisateur connecté via le site1.com.
parce que les cookies ne sont pas partageables entre les différents domaines (autres que les sous-domaines, mais je suppose que vous ne parlez pas de sous-domaines), vous devez passer quelques informations sur le lien pour site2.com qui va la laisser parler avec son back-end et de savoir ce que l'utilisateur que vous êtes.
permet de commencer avec une naïveté solution et ensuite travailler notre façon de les faire résoudre certains des problèmes qu'il pose:
supposons que vous avez une table des utilisateurs sur certains DB et votre utilisateur dispose d'une pièce d'identité.
maintenant, supposons que l'utilisateur authentifié sur site1.com et il est de l'utilisateur 123 à partir de votre base de données.
Le plus naïf solution serait d'appeler site2.com/url/whatever?myRealID=123
et ont site2 vérifier cette identité et "croire" à l'utilisateur que c'est bien lui.
Problème: n'importe qui (même un utilisateur valide de votre site) qui permettra de voir votre lien peut créer un lien avec myRealID=123 ou d'essayer d'autres valeurs. et site2.com accepte de lui en tant que cet utilisateur.
Solution: permet de ne pas utiliser deviner ID supposons que vous ajoutez à votre table des utilisateurs un GUID unique et si l'utilisateur 123 a un guid de 8dc70780-15e5-11e0-ac64-0800200c9a66 puis appeler site2.com/url/whatever?myGuid=8dc70780-15e5-11e0-ac64-0800200c9a66.
Nouveau Problème: bien même si Il est très peu probable que quelqu'un va deviner de l'utilisateur de votre GUID son GUID peut encore être détourné par quelque moyen homme qui voit ce lien et il quelqu'un aura le guid il peut l'utiliser pour toujours.
Solution: Utiliser une clé privée enregistrés sur votre serveur de signer une chaîne de caractères qui contient les éléments de données, le temps actuel-le timbre, le site de destination (j'.e "site2.com") l'a dit GUID, cette signature peut être traduit en disant: "C'est une preuve que ce lien a été créé par le site à la fois pour l'utilisateur qui a ce GUID authentifiés par ce domaine" et l'envoyer à site2.com avec l'horodatage et de GUID. Maintenant, quand site2.com obtient le lien qu'il peut faire en sorte qu'il est signé correctement et si certains d'intermédiaire ou d'origine de l'utilisateur pourrait essayer de le changer de toute manière (soit de la modification du temps ou le GUID) puis la signature ne serait pas de match et site2.com refuse l'authentification de l'utilisateur.
Un dernier problème: si le lien est interceptée par un intermédiaire, il peut toujours l'utiliser si à partir d'une autre machine.
Solution: ajouter un nonce pour les paramètres transmis. Le nonce est juste un nombre aléatoire que votre système d'authentification devrait s'assurer qu'il ne vous permet pas de s'authentifier auprès de ce nombre, plus d'une fois (d'où le nom que N(ombre)-une FOIS). Notez que cela signifie que chaque lien que vous créez sur site1.com qui conduit à site2.com doit avoir une distincte nonce qui doit être enregistré sur le serveur de validation ultérieure.
parce que vous ne voulez pas garder l'ajout d'enregistrements à ce nonce table pour toujours, il est de coutume de se décider qu'un tel lien n'est valable que pour un certain temps après sa création. et si vous pouvez créer nonce enregistrements qui sont plus anciens que cette limite de temps.
J'espère que c'est le contour d'où la recherche de.
Il est possible que j'ai raté quelque chose, mais ce sont les lignes directrices de base, l'utilisation d'une signature pour attester de l'authenticité des données dans le lien et l'utilisation d'un nonce pour empêcher l'intermédiaire des attaques. Je vous recommande également l'utilisation de HTTPS pour ces liens si possible.
Eyal
Vous pourriez essayer de mettre en œuvre un Réseau Mondial De L'Auto-Login solution à la Dépassement de Pile.
Il y a un perspicace post concernant sa brillante mise en œuvre par Kevin Montrose ici.
Elle aurait besoin de Cookies, HTML5 localStorage, Javascript, Iframe et beaucoup de contrôles de sécurité, mais je pense que ça en vaut la peine.
Permettant aux utilisateurs d'utiliser leur facebook/yahoo/gmail/openID solution est un début, mais ce n'est pas ulimately résoudre la solution de la mise en œuvre ou l'utilisation de son propre solution.
Avoir développé et géré la mise en œuvre dans le passé (nous avons finalement allé vers SiteMinder, mais je devine que vous ne voulez pas le coût réel d'un produit), je pense qu'Il a une très bonne idée, mais j'aimerais ajouter une petite astuce pour elle.
Au moment de l'authentification, de générer un code aléatoire (peut être une valeur GUID, mais il n'est pas statique par l'utilisateur) qui est stocké dans une table transactionnelle avec l'id de l'utilisateur. Ce code a une durée de vie maximale (vous aurez besoin pour juger de la valeur de la sûreté de cette période de temps). Ce code devrait idéalement être hachés avec le nom d'utilisateur ou cryptées et transmises dans l'URL.
Avez-vous essayé quelque chose comme Charles de renifler ce qui est envoyé en arrière et en avant? Il pourrait être en mesure de décomposer davantage les choses pour vous.
Comme mentionné par FlipScript, peut-être en utilisant OAuth/OpenID peut-être une voie à suivre pour vous?
Prendre un coup d'oeil à Jasig CAS http://www.jasig.org/cas . Je pense qu'il va faire ce que vous voulez. Il est open source, et a un certain nombre de plugins pour vous permettre de vous authentifier l'utilisation de plusieurs sources d'authentification et de plusieurs domaines/langues.
Utiliser Quelque Chose Comme .NET Passport (IE. Windows Live Id) Ou La Façon dont Facebook A Fait Avec Leur API, Qui Peut Être librement Consulté.
Pourquoi pas utiliser Open ID à cette fin.
OperID sera la solution optimale pour ce problème.