2009-07-07 7 views
0

J'ai une application web qui permet à un utilisateur de pointer son DNS sur mon IP et mon application va servir son contenu basé sur le nom de domaine que je vois dans l'en-tête de l'hôte HTTP. Je devrais préciser que cela est fait par l'application, pas par le serveur HTTP réel (apache), c'est une sorte d'application rebranded. Le problème que j'ai, c'est que je voudrais que les utilisateurs puissent se connecter via un formulaire sur la page servie et rester en quelque sorte dans le domaine de l'utilisateur. C'est facile, sauf si vous voulez de la sécurité. Je devrais avoir un certificat SSL installé pour chaque domaine pour le retirer. En ce moment je peux le faire en soumettant le formulaire à un domaine avec un certificat SSL installé, mais en raison de la sécurité du navigateur, je ne peux pas définir exactement les cookies requis sur le domaine d'origine.Comment autoriser une connexion sécurisée sur plusieurs domaines

Est-ce que quelqu'un sait un moyen que je peux connecter en toute sécurité les utilisateurs par le biais de l'application qui ne nécessite pas l'installation de nombreux certificats ssl. Je peux penser à des façons alambiquées en utilisant des redirections ou d'autres mécanismes, mais ce n'est pas si propre. Je ne me dérange pas un soumettre à l'url sécurisée et une redirection, c'est juste la mise en place du cookie ne peut pas être fait.

Répondre

2

Une astuce courante consiste à transmettre des données dans l'URL. Facebook Connect does this. Vous pouvez rediriger d'un domaine à l'autre avec un jeton de session dans l'URL, puis vérifier le jeton (peut-être convertir en un cookie) lorsque la requête arrive sur l'autre domaine. Edit: le MSDN article que les liens de Facebook à a beaucoup plus de détails.

3

Je l'ai fait avant d'utiliser la méthode suivante ...

Créer clé auth sur le serveur 1.

create_auth_key 
    expires = time + expire_time 
    data = username + '|' + password + expires 
    secret = 'my secret key' 
    hash = md5(data + secret) 
    key = base64(data) + hash 

Sur le serveur deux vous passez le nouveau authkey

valid_auth_key(key) 
    hash = key[-hash_size:] 
    b64data = key[:-hash_size] 
    data = base64decode(b64data) 
    data_hash = md5(data + secret) 
    if data_hash != hash: 
     return false # invalid hash 
    data_parts = data.split('|') 
    user = data_parts[0] 
    password = data_parts[1] 
    expires = data_parts[2] 
    if now > expires: 
     return false # url expired 
    return true 

C'est un peu rapide et sale, mais ne repose que sur des données simples transmises via URL. L'inconvénient est qu'une url spécifique est tout ce qui est nécessaire pour se connecter et quelqu'un pourrait partager cette URL pour une période de temps. Vous devez également vous assurer que votre temps d'expiration n'est pas supérieur à la différence de temps entre les serveurs.

Questions connexes