2011-03-17 178 views
0

我有一个服务器说'XYZ'和许多不同域的客户端,说A,B和C.认证是在服务器完成。 - 当用户第一次到达任何网站时,我们会要求他为该网站创建帐户。他会输入电子邮件和密码。我们将数据发送到服务器并存储thr。现在他已经在'XYZ'账户中登记,以便他可以登录到任何A,B和C站点。php会话登录系统

下一步:例如说,他来到B站点登录,他输入电子邮件和密码。我们会将这些数据提交给服务器来验证,如果密码与电子邮件相匹配,我们会将状态'是'发送回客户端,以便他成功登录并进入内部页面。

因为发送电子邮件和状态'yes'返回碰撞并不安全。我们正在使用套接字编程。这样外界的人就不会知道我们正在发送什么数据并回来了。 因为我们使用套接字,所以我们无法创建任何会话或cookie,因为我们没有在浏览器中打开服务器站点。

我想,如:当用户成功登录到站点B.如果同时在下一个选项卡他去站点C.他不应该要求登录(不应显示登录页面)。他会自动登录(进入内页)。

+0

哇,这是*从未*工作过! :)另外,我为你的问题添加了一些相关的标签。 – Charles 2011-03-17 06:50:52

回答

4

你正在寻找的东西叫single sign-on(缩写为SSO),这是一个难以正确解决的问题。有lots and lots of SSO schemes,其中所有的都以自己特殊的方式吸得可怕

您的目标方式的一个主要障碍是我们通常如何跟踪网络登录:cookies。特别是,一个域只能设置属于它的Cookie。这意味着如果您的三个网站位于三个不同的域中,则不能让一个网站为其他网站设置Cookie。

解决此问题的常用方法是实际将验证服务置于另一个域名上。无论何时您需要检查用户是否已登录,都可以将他们指向该验证服务。流行的统一登录机制OpenID使用这种技术。 OpenID是StackOverflow使用的。 (如果你使用各种StackExchange站点,你可能已经注意到你有时可以在加载页面后自动登录到其他站点,但我仍不确定这是如何工作的,并且还没有调查过。 )

从你所描述的,你会通过中央认证服务。你甚至可能会发现,实现一个基于OpenID的系统甚至可以为你的网站工作......但如果你这样做,我鼓励你隐藏整个URIs作为身份的事情的复杂性,普通的最终用户是不太可能的了解这个概念。

+0

你说过:“无论何时您需要检查用户是否已登录,都会将他们引导至该身份验证服务。”指导他们服务器后应该做些什么?我无法设置Cookie。因为认证是通过套接字完成的。我应该在数据库中设置一个变量吗? – aparna 2011-03-17 07:07:46

+0

我的意思是,你应该将用户引导至认证服务器进行认证,然后让用户以后用适当的SSO令牌发送回原始网站。然后,原始站点可以使用SSO令牌向认证服务器发送请求,以查看发生了什么 - 用户是否自动登录,是手动登录还是未登录。 – Charles 2011-03-17 07:32:04

0

您可以在用户登录XYZ网站后在浏览器中设置Cookie吗?

因此,现在当用户访问网站A,B或C时,您可以检查Cookie是否针对XYZ域进行设置,如果是,则可以登录该用户。但请注意,您只能在(XYZ)子域之间共享cookie,而不能在不同域之间共享cookie。

+0

我也无法设置cookie。我有在数据库中设置变量的想法,无论他是否登录或不为特定的IP地址。我不知道它是否会起作用。 – aparna 2011-03-17 06:52:53

+0

请参考以下内容设置跨子域的Cookie:http://www.w3schools.com/php/func_http_setcookie.asp – 2011-03-17 07:00:36

+0

网站不是服务器的子域,它们是完全不同的域。 – aparna 2011-03-17 07:24:45