如何在iframe中启动一个有效的用户会话


How to start a valid user session inside an iframe

我需要设置一个主站点,将嵌入站点1和站点2在iframe,登录和开始用户会话在他们。

站点1 (RoR)和站点2(未知框架)有自己的身份验证(用户名,通行证,cookie,通常的框架安全性)。

主站点(PHP)服务器直接访问站点1数据库,我知道密码散列算法,所以我可以验证主站点的登录密码对站点1。站点2可以得到他们的密码更改相应的,如果需要,但没有访问数据库和框架。

不幸的是,我无法更改Site 1或Site 2中的任何内容。我只能围绕它构建,尽管Site 1有完整的读取权限。

为了更好地表达我的意思/需要,我已经画了一个快速的图表:

一只忙碌的猫http://gettaxi.me/public_img/help.png

我需要在iframe内启动一个用户会话。站点1的登录凭据与主站点的相同,因为它们来自相同的数据库,站点2的凭据将被假定为相同(如果不是,可能只是显示登录失败)。

创意列表:

  1. 我可以记录登录凭据到主站点cookie,并使用它来填充iframe字段。也许存储一个加密版本,并在需要时解密?但是,将密码存储在cookie中(即使是加密的)似乎是荒谬的。

  2. 与上面相同,但将其存储在Master Site会话变量中

  3. 跨域cookie的想法在这里似乎毫无用处,因为每个网站都必须设置自己的会话cookie,一个网站不能为另一个网站设置它…

我以前从来没有处理过像这样的跨域问题。因此,在我像疯子一样开始编码之前,我向您寻求帮助和建议!你会怎么做呢?这可能吗?

额外的问题:

  1. 站点1和站点2在iframe内设置的cookie行为相同吗?他们是持久的,如果我打开相同的网站不是在iframe以后,他们会被接受吗?

  2. 如果存储凭据(cookie/session)是唯一的方法:我如何在iframe中填充登录字段并提交表单?Javascipt吗?一些简洁的GET/POST/重定向技巧?

提前感谢!

好的,结果很简单。而对那些不满的人…face -我会在这里发布我自己的解决方案,谁知道呢,也许有人会发现它有用。

  1. 用户登录主站
  2. <
  3. 验证凭证/gh>
  4. 生成随机客户端令牌
  5. 用该令牌加密密码,并将密码存储在会话变量
  6. 设置cookie并在用户浏览器中存储该令牌

点击链接到站点1或2时的jQuery动作:

  1. 用这个令牌向服务器发送一个ajax请求
  2. 验证用户会话并在成功时解密存储的密码
  3. 将密码发送回客户端,并预先填写一个隐藏的表单的用户名和密码字段,该表单模仿框架化网站的登录表单
  4. target="iframe"提交表单
  5. 清除那些表单预填的表单字段

Vuala,一个工作跨域iframe自动登录…

当然还有更多的像隐藏,取消隐藏div按钮点击,会话超时,令牌到期更新在任何用户操作等,但主要的事情是,它的工作!是的,密码以明文形式发送了3次,但这些网站都没有HTTPS。密码也不会以明文形式存储。

更新:

说得太早了。当iframe内容返回Access-Control-Allow-Origin标头时,IE和Safari会出现问题。他们更强的安全策略谨慎对待iframe内容,不允许保存会话cookie。这个问题可以通过在IE中删除隐私设置来解决,或者在Safari中允许第三方cookie,或者简单地检测浏览器,如果它是上述之一-在新选项卡/窗口中打开它。

相关文章: