如何允许跨多个域进行安全登录

时间:2009-07-07 16:20:33

标签: http authentication

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

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

2 个答案:

答案 0 :(得分: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

在服务器2上传递新创建的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传递的简单数据。不利的一面是,只需要一个特定的网址即可登录,有人可以在一段时间内共享该网址。您还必须确保过期时间不大于服务器之间的时差。

答案 1 :(得分:2)

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

相关问题