我正在开发一个允许我通过各种域登录同一系统的系统. (www.example.com,www.mydomain.com,sub.domain.com等)
到目前为止,以下主题构成了我研究的基础:
Single Sign On across multiple domains
Cross web domain login with .net membership
我想要发生的是,如果我登录主域并访问从属域上的页面以自动登录到从属域.
演练:
1.用户登录主站点
2.用户导航到从站点
3.从站点重定向到主站点以查看用户是否已登录.
4.如果用户登录主服务器,则记录RFC 4122令牌ID并将其发送回从站点.
5.然后,Slave站点在中央数据库中查找令牌ID并将该用户记录下来.
这可能最终会在不止一次的PHP和Apache实例上运行,所以我不能只存储:
token_id, PHP_session_id, created
我存储和使用它有什么问题:
token_id, username, hashed_password, created
解决方法:
基本的想法是你所引用的链接,但它也谈论会话管理 – 忘记在数据库中存储什么 – 你需要做的就是在主服务器和客户端上启用会话.并将经过身份验证的用户名存储在会话中(主要是为了查看用户是否已通过身份验证).
- User navigates to client site
- Client site re-directs to master site to see if User is logged in.
否 – 如果从站点确定用户未经过身份验证,则只从重定向从站点(称为客户端变得混乱).
忘记RFC 4122 – 它只是一种聪明的方式来获取在您称为会话标识符的帖子中使用的uuids. PHP已经生成了非常好的值.
您需要将某种消息从主服务器传递回从服务器,该服务器提供用户ID以及用户已在URL中进行身份验证的事实(您无法跨域传输cookie,也无法在域中执行POST重定向).这样做的一个显而易见的方法是在主服务器和从服务器上共享秘密,然后….
$redirect_to='http://slave.example.com/sso_lander.PHP?auth_token='
. encrypt($some_random_alphanum_chars
. '/' . $user . '/'
. time(), $shared_secret);
header("Location: $redirect_to", true, 303);
然后在奴隶上:
if (!($_SESSION['authenticated_user']) && $_GET['auth_token']) {
$auth_token=explode('/',decrypt($_GET['auth_token'], $shared_secret));
if ((abs($auth_token[2]-time())<3) {
// if more than 3 seconds after generate - DO NOT USE
$_SESSION['authenticated_user']=$auth_token[1];
}
}
请注意,上面仅用于说明 – 仍然有一个小窗口可用于重放攻击和其他应该整理的东西 – 更好的解决方案是从属生成一个挑战,它存储在本地会话中并复制到主服务器.主设备在加密回复中包含此内容.但是这个代码有点复杂.
C.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。