SSO大家应该有所了解吧?就是单点登录,原理其实很简单,网上也有很多方法,大家也都看得懂,但是现在存在一个问题:
假如我们有www.a.com、www.b.com、www.c.com这3个网站,它们的基本情况如下:
1.已经投入实际运行
2.是不同的开发商提供的
3.每个网站单独一台服务器
4.不在同一局域网内
现在要求加入一个www.d.com站点(该站点可以与前面提到的3个站点同服务器,但也不是必须),该站点中有一个SSO系统,通过该系统认证后,就可以随便访问前面提到的那3个网站了。
现在有个很棘手的问题:如何在不修改原有系统www.a.com、www.b.com、www.c.com的情况下完成SSO?网上的资料基本上全部要或多或少的修改原有系统。
用Session?Cookies?这些都涉及到跨域,而且在有些情况下还不得不修改www.a.com等。
各位高手有没有什么高见?指点小弟一下,不甚感激。PS:请各位看清楚,是“在不修改已有系统”的情况下实现SSO哦!

解决方案 »

  1.   

    我的基本思路是,在SSO系统中为每个用户建立一个通用帐号,使用该通用帐号登入SSO系统,然后在SSO系统中具体配置用户要访问的每一个站点(如www.a.com等)的用户名和密码,保存好后,以后用户要访问www.a.com或者www.b.com等,只需登录SSO系统,然后直接点击相应的“登录”按钮就可以直接访问www.a.com或者www.b.com了。
    也就是说,SSO系统做了一个中间代理,代替用户向www.a.com提交登录信息。我们再来假如,www.a.com是ASP.NET开发的,login.aspx页面的HTML代码示例:<table border="0" width="100%" cellspacing="0" cellpadding="3" height="100">
     <tr>
      <td align="right" width="60">用户名:</td>
      <td align="left">
       <asp:TextBox ID="txtUsername" runat="server" MaxLength="16" Width="160px" Height="24px"></asp:TextBox>
      </td>
     </tr>
     <tr>
      <td align="right" width="60">密码:</td>
      <td align="left">
       <asp:TextBox ID="txtPassword" runat="server" MaxLength="16" TextMode="Password" Height="24px" Width="160px"></asp:TextBox>
      </td>
     </tr>
     <tr>
      <td align="right" width="60"> </td>
      <td align="left">
       <asp:Button ID="btnLogin" runat="server" Text=" 登录 " Height="24px" Width="60px" onclick="btnLogin_Click" />
      </td>
     </tr>
    </table>
    login.aspx页面的CS代码示例:    protected void btnLogin_Click(object sender, EventArgs e)
        {
            if (Admin.CheckAdmin(txtUsername.Text.Trim(), txtPassword.Text.Trim()))
            {
                //验证成功
                Session["usern"] = txtUsername.Text;
                Session["login"] = "true";
                Response.Redirect("manage.aspx");
            }
            else
            {
                //验证失败
                Response.Write("login error.");
            }
        }像这样的情况,我有两个问题不是太清楚:
    1.在www.d.com中的SSO中,用POST方法将用户名、密码POST到www.a.com中,能实现如上形式的登录验证吗?
    2.login.aspx页面在www.a.com站点,而SSO的登录页面在www.d.com,且不在同一服务器、不在同一局域网,这样肯定会涉及到跨域的问题,如何解决?
      

  2.   

    在一个页面中使用iframe装入“其它网站”,然后使用javascript到相应的frame下中去寻找dhtml对象,模拟用户键盘操作,“登录”。
      

  3.   

    楼上所述的方法我在之前已经试过,可以做到模拟用户提交登录,但是无法进入系统,因为现有系统中的登录验证模式要用到Session,而通过iframe装入“其它网站”并用JS模拟登陆的方法在保存客户端SeesionID的时候是会出现问题的。
    由于客户端保存不了SessionID,所以也就没有办法登录进入系统(因为系统会验证用户是否具有某个SessionID,且其在服务器端的值是否为指定值,如果客户端连SessionID都没有,更何谈验证其在服务器端的Seesion值呢?)