2009-07-07 30 views
0

我有一个基于Web的应用程序,允许用户将他们的DNS指向我的IP,并且我的应用程序将根据我在HTTP主机头中看到的域名提供他们的内容。我应该指出这是由应用程序完成的,而不是由实际的HTTP服务器(apache)完成的,它是一种重新命名的应用程序。我遇到的问题是我希望用户能够通过提供页面上的表单进行登录,并以某种方式保留在用户的域中。这很简单,除非你想要安全。我将不得不为每个域安装一个SSL证书来解决这个问题。现在我可以通过将表单提交给安装了SSL证书的域来完成,但由于浏览器的安全性,我无法在原始域上准确设置所需的cookie。如何允许跨多个域的安全登录

有谁知道我可以安全地通过不涉及安装很多ssl证书的应用程序登录用户的方式。我可以想到一些使用重定向或其他机制的复杂方式,但它并不那么干净。我不介意提交给安全网址和重定向,它只是设置cookie不能完成。

回答

2

一个常见的技巧是在URL中传递数据。 Facebook Connect does this。您可以在URL中使用会话令牌从一个域重定向到另一个域,然后在请求进入另一个域时验证该令牌(可能转换为Cookie)。编辑:Facebook链接到MSDN article有更多的细节。

3

我使用下面的方法做之前...

创建于服务器授权密钥1.

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

在服务器的两个你通过新创建的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 

这是一种快速和肮脏,但只依赖通过URL传递的简单数据。不利的一面是,只有特定的网址才能登录,而且有人可以在一段时间内共享该网址。您还必须确保您的到期时间不超过服务器之间的时间差。