单点登录统一认证

随着数字化的不断普及,大型公式或者单位的各个部门逐渐的上了与本身业务相关的各种各样的系统(在这些系统中,以Web系统居多),几乎每个系统都需要识别操作者的身份,并根据其不同的身份,分配一定的权限,做一些操作上的限制。结果很多公司或者部门都在各个系统便各自设计了一套用户资料和权限管理的机制,并提供了用户登录证认。这样满足了上面的需求,但由此带来和用户账号管理不方便,用户资料不统一等等问题。在数字化网络化发展到一定阶段时,对用户资料的整合起来,进行统一的管理变得十分必要。

本文的目的在探讨一个简单有效的方案,将有一定联系,拥有统一用户群的系统进行关联,统一用户的登录资料,并提供统一的登录认证入口。统一认证系统与不同应用子系统之间建立一定的信任关系,通过一定的渠道交换认证信息,在保证用户信息安全的基础上,实现认证关系的共享机制。使用户一个地方一次登录之后,便可以在相应的应用系统群中遨游,而不用没到一个系统就进行登录,甚至使用不同的账号和密码进行登录。

网站与用户之间的认证关系,我们一般通过Session来建立,而Session(一般)在不同网站中是不能共享的。本方案的难点在于统一认证系统和应用子系统之间认证信息的共享。用户在统一认证系统中登录之后,与统一登录系统建立了认证关系,如果用户转向应用子系统,此时如何与子系统建立认证关系,如何将统一认证系统的认证关系迁移复制到子系统,这将是我们要解决的问题。


ASP.NET的Session保存机制(会话状态模式)有三种......


ASP.NET 支持三种会话状态模式: 

InProc:In-Proc 模式将值存储在 ASP.NET 辅助进程的内存中。因此,该模式提供了对这些值的最快访问。但是,当 ASP.NET 辅助进程被回收时,状态数据便会丢失。 

StateServer:与上一模式不同,StateServer 模式使用独立的 Microsoft Windows 服务来存储会话变量。因为该服务独立于 Microsoft Internet Information Server (IIS),所以它可以在另一独立的服务器上运行。您可以将此模式用于负载平衡解决方案,因为多个 Web 服务器可共享会话变量。尽管在重新启动 IIS 时会话变量不会丢失,但在跨越进程边界时,性能会受到影响。 

SqlServer:如果会话信息的持久性对于您很重要,那么您可以使用 SqlServer 模式,以便利用 Microsoft SQL Server 来确保达到最高级别的可靠性。SqlServer 模式类似于进程外模式,只是前者的会话数据维护在 SQL Server 中。SqlServer 模式还让您能够利用位于 IIS 进程外的一个状态存储区,该状态存储区既可位于本地计算机上,也可位于远程服务器上。

网站的默认Session状态模式应该是InProc,限制了本系统网站使用。StateServer和SqlServer都作为扩展,将会话信息存储在IIS进程之外,实现了不同Web服务器之间的共享。当然,这两种模式都需要做相应的配置和消耗一定的性能,我们暂且不说这一点。仔细研究发现,这两种扩展模式主要面向的是网站的分流和负载均衡,共享Session的网站之间的结合是非常非常密切的,并且ASP.NET将所有的实现都进行了封装,我们无法获取和记录每一次共享的细节。这并不适合我们最开始的需求。

假设:A系统通过Session保存了一个User实例,那么如果B系统需要使用这个Session,则必需拥有A系统中User的细节。如果A、B两个系统是完全不同,甚至其中不同细节User类,更甚至A、B系统中都不只一处功能使用到Session,Session的命名又总碰巧一致。呵呵,那一切将变得不可思议。当然,如果我A、B为统一个系统的两个不同的应用层,那StateServer和SqlServer这两种方式将能够很好的满足需求。至于要满足我们上面的需求,只能是另外想办法了。

寻找解决办法,我们比较关系用户体验,那么先从用户的使用流程开始.......

根据我们的需求,用户的体验一般有两种:

一、对于使用多个子系统的用户,将有可能直接登录统一认证系统,并通过统一系统的子系统连接列表,跳转到多个子系统;二、对于一些使用单个子系统,或者自为单具体事情进入我们平台,或者是登录超时了,这是他应该向直接进入特定子系统,那么我们需要将登录验证在他进入子系统之前插入。两种不同方式的三个系统之间的交互过程如下图所示:


图 1. 一般步骤,同时登录多个子系统


图 2. 直接进入子系统,子系统之间跳转

我将按照第一种交互方式进行解释:

1、用户先与统一登录系统进行交互,使用唯一的帐号密码进行登录,此时不涉及任何子系统;

2、用户登录成功后,统一登录系统将信任的应用子系统列表呈现给用户;

3、用户根据需要,选择子系统连接访问子系统,用户与子系统的交互开始;

4、由于用户与子系统此时还没有建立认证关系,所以子系统将用户重定向到统一登录系统;

5、统一登录系统验证用户的登录信息,发现用户已经登录,便将登录信息插入到数据库,再将验证信息发给用户,即返回一个等待页面;

6、用户将等待页面中的验证信息提交(自动)到子系统,子系统获取认证信息;

7、子系统通过一定的办法和等待页面中的验证信息进行验证,并与用户建立了信任关系;

与ASP.NET封装的实现方案项目,这交互过程看起来十分烦碎,我们还需要自己实现大量的功能。但我们的交互实现过程都是可控的,各个系统之间传递的信息内容,什么时候传递,我能都可以限制和约定,并且能够将每一次系统之间的交互记录都进行登记,这才是我们需要的。至于烦碎,其实对用户来说,增加的步骤就是出现自动提交的等待登录页面,如果两个系统都能正常运行,网络也没有出现堵塞,用户等待的时间将及其短暂,甚至没能看到页面。并且我们能够对等待页面做一定的美化,使用户就算看到等待页面,也不会感到厌烦。

说了这么多,统一认证系统的应用子系统Session的共享还没有开始,这是本方案最大的难点......

下面就简述统一认证系统的应用子系统Session的共享的实现,我和一位同事根据大伙的讨论结果,分两种方式进行实现,详细情况如下:

第一种方式:通过MD5加密随机字符串,使用了Web服务实现了子系统和统一认证系统之间的交互验证。验证信息包含两部分用户在统一登录系统的Session ID和数据库中的随机ID。当子系统将用户重定向到统一登录系统的时候,验证的交互过程开始,详细步骤如下:

1、统一登录系统获取用户的Session ID和登录名

2、统一登录系统将Session ID和登录名插入到数据库,产生一个随机的数据库ID

3、将Session ID和数据库ID结合起来,进行MD5加密

4、使用MD5密文和数据库ID构建一个登录等待页面,返回给用户

5、用户将登录等待页面中的信息自动提交给子系统

6、子系统通过Web服务将MD5密文和数据库ID提交回统一登录系统

7、统一登录系统查询数据库,并进行验证

8、统一登录系统返回用户登录名,并删除数据库中的登录记录。

9、子系统与用户建立认证关系


图 3. MD5随机加密,Web服务实现验证

第二种方式:通过对认证信息(登录令牌)进行非对称加密,一次交互实现验证。验证信息为一个包含了产生时间的Token类。验证的交互过程同样是在重定向到统一登录系统的时候开始,详细步骤如下:

1、构建一个包含生成时间的Token类,将Token类序列化

2、使用SHA-1,对序列化Token编码进行散列,产生验证码H

3、将序列化Token编码和验证码H结合,使用公钥加密

4、使用密文构建一个登录等待页面,返回给用户

5、用户将登录等待页面中的信息自动提交给子系统

6、子系统使用私钥进行解密

7、子系统分离出散列验证码H和序列化Token编码,并进行SHA-1验证

8、检查Token中的生成时间,判断是否超时

9、子系统与用户建立认证关系


图 4. 非对称加密,一次交互实现验证两种方式各有优缺点,大家很明显就能看出,我就不做总结。我们最终选择的方案是第一种,并且在验证过程中增加了一个Session识别子系统,防止非法的阻塞和冒充。即在应用子系统将用户重定向到统一认证系统系统时,子系统与用户建立Session,并在用户转交认证信息时,验证是否原本用户。防止有非法者获取了和用户转交的认证信息,并在用户之前提交给子系统,骗取认证。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 单点登录(Single Sign-On,简称 SSO)和统一认证(Unified Authentication,简称 UA)都是针对多个应用系统的用户身份认证和授权管理的解决方案,但二者有一定的区别。 单点登录是指用户只需要登录一次,就可以在多个应用系统中使用同一个身份进行访问和操作。用户只需要在第一个系统进行身份认证之后就可以直接进入其他系统而无需再次输入用户名和密码。这样可以提高用户的使用体验和工作效率,同时也降低了密码管理的复杂度和安全风险。 统一认证则更强调的是用户身份认证统一性和一致性。用户在不同的应用系统中使用相同的身份认证方式和标准,这样可以确保认证安全性和可靠性。统一认证可以通过多种技术实现,如 LDAP、OAuth、OpenID Connect 等。 因此,单点登录统一认证虽然都是解决多个应用系统中用户身份认证和授权管理的问题,但重点不同,前者注重用户的使用体验和效率,后者注重身份认证安全性和一致性。 ### 回答2: 单点登录(Single Sign-On,简称SSO)和统一认证是两个不同的概念。 单点登录是指用户只需一次登录,便可访问多个相互关联的系统资源,而无需再次输入用户名和密码。用户只需在完成一次身份验证后,就可以自由访问各个系统,提高了用户的使用便利性和效率。例如,当用户在使用某个网站登录后,再访问其他的相关网站时,不需要重新输入登录信息,而可以直接访问其他网站。 统一认证则是指在一个集中的中心系统中管理和维护用户的身份认证信息。通过这个中心系统,用户可以进行一次身份验证,然后被授权访问各个相关系统。统一认证的目的是提高用户身份验证的安全性和准确性,以及简化用户管理的操作流程。统一认证的关键是集中管理用户身份,保护用户的敏感信息。 因此,单点登录统一认证有一定的相似之处,都是为了提高用户的使用便利性和方便性。但是,单点登录侧重于用户的登录体验,让用户在访问多个系统时不需要重复输入登录信息;而统一认证侧重于用户身份的集中管理和保护,通过中心系统对用户进行验证和授权,增加了用户的安全性和准确性。 总结起来,单点登录是为了提高用户体验,避免重复登录;而统一认证是为了集中管理用户身份和提高身份验证的安全性。两者可以结合使用,以实现更好的用户登录和访问管理体验。 ### 回答3: 单点登录(Single Sign-On,简称SSO)和统一认证是身份认证和授权的两种不同方式。 单点登录是一种用户在完成一次认证后,可以在多个相关应用中实现免登录访问的机制。它利用一个统一认证中心来验证用户身份,并生成一个安全的令牌来表示登录状态。通过在不同的应用之间传递令牌,用户在登录后只需登录一次,即可在其他应用中访问受保护的资源,实现无缝切换。 而统一认证是一种集中管理和统一授权的身份认证机制。它通过一个中央认证服务器来验证用户的身份,并颁发令牌进行授权。通过统一认证,用户可以在不同的应用系统中共享身份认证信息,避免多次输入账号密码进行认证统一认证可以整合多个不同的认证机制,提供统一的登录和权限控制,提高用户体验和安全性。 总结起来,单点登录是为了解决用户多次登录不同应用的问题,用户只需登录一次即可访问多个应用;而统一认证则更加侧重于整合不同应用的身份认证机制,提供一个中央的认证系统进行管理和授权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值