【发布时间】:2011-01-02 05:25:26
【问题描述】:
如果你们对此有任何想法/见解,我将不胜感激......
我有两个域运行相同的应用程序,例如mysite.com 和 mysite.org,我有一个要求,当用户登录 mysite.com 时,他也应该登录到 mysite.org。显然,我不能在另一个域上设置 cookie,但我想提出一个合理、安全 的解决方案。我想我有一个解决方案(在纸上),但我只是想要一些关于如何改进和保护它的反馈。
我的会话表目前如下所示:
id: auto-incrementing; only used for by ActiveRecord
uuid: Universally Unique Identifier used for session lookup
user_id: the user this session belongs to
user_ip_address: the user's IP address
created_at: self-explanatory
updated_at: self-explanatory
我目前在 one 域上进行身份验证的逻辑:
- 用户尝试访问 mysite.com/some_protected_info;他们没有经过身份验证,因此他们被重定向到登录页面(推荐 URL 存储在 cookie 中)
- 用户在 mysite.com 上成功验证;在数据库中创建一个会话;为 mysite.com 创建一个 cookie;用户被重定向到 cookie 中的推荐 URL,即 mysite.com/some_protected_info。
我提出的在两个域上进行身份验证的逻辑:
- 用户尝试访问 mysite.com/some_protected_info;他们没有经过身份验证,因此他们被重定向到登录页面(推荐 URL 存储在 cookie 中)
- 用户在 mysite.com 上成功验证;在数据库中创建一个会话;为 mysite.com 创建一个 cookie;然后将用户重定向到 mysite.org,例如mysite.org/login/special
- 登录控制器的特殊操作会查找会话,发现会话有效并在 mysite.org 上设置 cookie 并重定向回 mysite.com 上的另一个控制器操作。
- 鉴于用户在 mysite.com(可能是 mysite.org)上经过身份验证,用户将被重定向回推荐 URL (mysite.com/some_protected_info)。
注意: - 两个站点都使用 SSL。 - 两个站点都使用完全相同的代码(mongrel 实例) - Apache 配置使其可以通过不同的域访问,即两个域上的 config.action_controller.session 设置完全相同。
问题:
在 (2) 中,我应该通过 SSL 传递 UUID 还是出于安全考虑?我应该生成一个新的、随机的临时 ID 来查找会话吗?
在 (3) 中,我应该传递引荐 URL (mysite.com/some_protected_info) 还是仅重定向回 mysite.com 上 cookie 的值是否安全?
有什么问题吗?我忽略的特殊情况?
【问题讨论】:
-
就个人而言,我会将引用 URL 作为变量存储在服务器端,与会话相关联。我反对在 cookie 中存储除 sessionID 或 userID 之外的任何内容(用于持久的非安全登录);这些 ID 是服务器端存储首选项的关键。但这是一种偏好,而不是建议。
标签: ruby-on-rails ruby session cookies single-sign-on