针对分析单点登录(流程图与数据安全)提出的问题及解决方案

    上一篇本人根据园友的文章:[原创]单点登陆(SSO)组件的设计与实现,根据自己的理解进行一次总结性的分析:分析单点登录(流程图与数据安全).

    当时根据SSO的流程做下了个人分析,也得到不少园友的评论及帮助,可是可惜的是,没有一位园友提出我画的流程图中存在的问题.这也可是大家没有看明白我的图(本人不才).

    当时自认为在流程上以及业务逻辑上都没有太大的问题,至到有次和朋友谈到了SSO,当时我非常自豪的说出了SSO的流程及思路,他也非常认可,可是他的一个问题把我难倒了.

   他的问题是这样的:  

       如果用户A在联盟站点SiteA中通过了认证中心的认可.这样用户A的用户uid就会出现在认证中心中的线列表中.此时如果用户A重新打开一个联盟子站点SiteB,此时在联盟站点SiteB中如何确认这个用户的身份呢?按
理说这个用户A在联盟点SiteB中应该是登录状态.

   为此再次贴出自己理解的SSO流程图,并在图上附上了困扰我的三个问题.

  

  
      按照SSO登录流程来看(个人理解):

      首先:
            判断本站点的Session["uid"]是否存在,如果本站点的会话状态存在则说明是登录状态.
           
             问题:用session来管理子站点的会话状态,可以有效的减少子站与联盟站点的关联.但是当子站点的session过期后,此时的情况有可能是这样的,在子站点A中存在的Session没有过期,但子站点B中的Sesion 正好过期,而用户又没有通过正常的退出操作,此时如何控制认证中心的在线列表呢?是存在还是不存在呢?

      其次:
            如果Session["uid"]不存在,则判断网页参数中是否有uid这个参数,如果有则通过uid到认证中心中判断这个uid是否在认证中心的在线列表中,如果有则说明此用户是登录状态.不知道这样理解是否正确.
 如果是这样,那么问题是这样的:
            如果用户A登录成功了,此时用户B知道用户A网页上的参数uid,他人为的在其它子站点中的页面中加入这人参数,此时应该也会是登录状态.如何解决这个问题呢?

      还有一个问题就是我朋友提出的:
      如果用户A在联盟站点SiteA中通过了认证中心的认可.这样用户A的用户uid就会出现在认证中心中的线列表中.此时如果用户A重新打开一个联盟子站点SiteB,此时在联盟站点SiteB中如何确认这个用户的身份呢?不同
站点的Session是不能共享的.(如何知道是用户A登录而不是用户B呢?)按理说这个用户A在联盟点SiteB中应该是登录状态.

      本人分析:
      1:新打开的联盟站点是肯定不存在Session的,因为站点间Session是不能共享的.
      2:新打开的联盟站点是肯定不会存在用户的uid的.
      此时根本不能判断用户是否已经在认证中心中登录过.
     
    本文的焦点其实就在于联盟站点如何确认用户身份的问题.即如何确认用户的uid.

    经过本人的假想:我的解决思路是这样的,不知道实际应用中是否可行。
    
   
     用户A在站点SiteA中登录成功后,将用户的UID和用户IP以cookie的形式保存在客户端。当用户打开一个新的联盟子站点(例如SiteB)时,此时的判断用户状态的流程变成上图.一般用户的IP在一定时间内是唯一确定的,这样做应该可以保证用户身份的正确性与唯一性(个人是这样认为),不知道这样做是否正确.上面的流程图应该可以解决我在本文中的第一幅图中的三个问题。

    本人学艺不精,一直未对SSO有正确的理解,本人凭着对SSO的热情,希望能够通过和各位园友的热诚探讨来分析SSO的最佳方案.

原文地址:https://www.cnblogs.com/ASPNET2008/p/1227556.html