最近有个测试需求是和登录相关的,和开发聊了一会对方给我提了N多种登录方式,发现我之前接触到的认证方式无非就是Session、Token、AD、三方认证这些基础的,知识储备明显不够,还好周末可以来个紧急恶补,总结一下业界使用较多的认证。(方式太多了,仅列了代表性的一些)
Session
较早期的认证方式,最开始是cookie+session,后来H5出来了又有了local storage+session,cookie不支持跨域,storage支持跨域。原理其实是一样的,认证通过后sever端或者缓存中会存session。缺点是用户多了会占用大量内存。
Token
原理和session类似。用户在登录表单中输入用户名和密码,然后点击登录。请求通过在请求头中携带token发送登录请求之后,通过在后端查询数据库验证用户的合法性。通常会让用户表与token有关联关系,一般还会对token加密,而且还会设置过期时间。所以一般采用redis来存储,key存token,值存用户相关信息。通过查库的时间上的消耗来减少服务器的空间消耗,但是还存有信息,用户多了内容消耗依然巨大。
JWT
Json Web Token,是为了在网络应用环境间传递声明而执行的一种基于JSON传输格式的开放标准,可实现无状态、分布式的Web应用授权。
类似Token的原理,只是服务器不再存token了,而是在用户第一次请求发送账号密码后在服务端生成JWT令牌,之后再将JWT传给客户端,客户端每次请求也带着JWT,服务端每次收到后会根据密钥来解密JWT再进行验证。
验证原理:JWT保护3部分,header,payload,signature
首先需要指定一个secret,该secret仅仅保存在服务器中,保证不能让其他用户知道。然后使用Header指定的算法对Header和Payload进行计算,然后就得出一个签名哈希。也就是Signature。那么Application Server如何进行验证呢?可以利用JWT前两段,用同一套哈希算法和同一个secret计算一个签名值,然后把计算出来的签名值和收到的JWT第三段比较,如果相同则认证通过。
OAuth
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。OAuth2.0是OAuth协议的下一版本,但不向下兼容OAuth 1.0。
OAuth 2.0原理:
Client 请求 Resource Owner 的授权。授权请求可以直接向 Resource Owner 请求,也可以通过 Authorization Server 间接的进行。
Client 获得授权许可。
Client 向 Authorization Server 请求访问令牌。
Authorization Server 验证授权许可,如果有效则颁发访问令牌。
Client 通过访问令牌从 Resource Server 请求受保护资源。
Resource Server 验证访问令牌,有效则响应请求。
SAML
SAML即安全断言标记语言,英文全称是Security Assertion Markup Language。它是一个基于XML的标准,用于在不同的安全域(security domain)之间交换认证和授权数据。
SAML规范定义了三个角色:委托人(通常为一名用户)、身份提供者(IdP),服务提供者(SP)。在用SAML解决的使用案例中,委托人从服务提供者那里请求一项服务。服务提供者请求身份提供者并从那里并获得一个身份断言。服务提供者可以基于这一断言进行访问控制的判断——即决定委托人是否有权执行某些服务。
在将身份断言发送给服务提供者之前,身份提供者也可能向委托人要求一些信息——例如用户名和密码,以验证委托人的身份。SAML规范了三方之间的断言,尤其是断言身份消息是由身份提供者传递给服务提供者。在SAML中,一个身份提供者可能提供SAML断言给许多服务提供者。同样的,一个服务提供者可以依赖并信任许多独立的身份提供者的断言。
SAML没有规定身份提供者的身份验证方法;他们大多使用用户名和密码,但也有其他验证方式,包括采用多重要素验证。诸如轻型目录访问协议、RADIUS和Active Directory等目录服务允许用户使用一组用户名和密码登录,这是身份提供者使用身份验证令牌的一个典型来源。许多流行的互联网社交网络服务也提供身份验证服务,理论上他们也可以支持SAML交换。LDAP
LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,LDAP标准实际上是在X.500标准基础上产生的一个简化版本;AD是ActiveDirectory的缩写,AD应该是LDAP的一个应用实例,而不应该是LDAP本身。比如:windows域控的用户、权限管理应该是微软公司使用LDAP存储了一些数据来解决域控这个具体问题。
公司内的各种人员账户,电脑打印机等设备管理是AD最常见的应用。可以将人员和设备加在活动目录里,对资源进行统一的管理。可以把公司分为多个域,每个域存储不同的信息,存储公司里各个资源的信息。
OIDC
OIDC是Open ID Connect的缩写。
OpenID Connect遵循oAuth2.0协议流程,并在这个基础上提供了id token来解决三方应用的用户身份认证问题。OpenID Connect将用户身份认证信息以id token的方式给到三房应用。id token基于JWT(json web token)进行封装,具有自包含性、紧凑性和防篡改性等特点。三方应用在验证完id token的正确性后,可以进一步通过oAuth2授权流程获得的access token读取更多的用户信息。
OpenID Connect大获成功的秘诀:
容易处理的id token。OpenID Connect使用JWT来给应用传递用户的身份信息。JWT以其高安全性(防止token被伪造和篡改)、跨语言、支持过期、自包含等特性而著称,非常适合作为token来使用。基于oAuth2.0协议。id token是经过oAuth2.0流程来获取的,这个流程即支持web应用,也支持原生app。简单,OpenID Connect足够简单。但同时也提供了大量的功能和安全选项以满足企业级业务需求。
WebAuth
WebAuth也被称为WebPortal认证,其实现过程为:用户认证前无论访问任何地址,都会被重定向到一个指定的页面(称为Portal即门户页面),需要在这个Portal页面上输入帐号密码进行认证,认证通过后方可顺利上网。与802.1X相比,其后台依旧是Radius协议,只是与用户交互的部分由EAPoL变成了Http。
WebAuth的好处显而易见,那就是无需安装任何客户端,换句话说它是一个B/S架构的认证方式。另外一个非常明显的好处在于,WebAuth提供了一个Portal页面与用户交互,那么基于这个认证页面就可以作出很多文章了,这也是为什么现在所有的公共无线网络都采用了WebAuth的认证方式,商家都会通过Portal页面来推送一些广告、通知等,由于这是用户上网的必经之路,所以在这里展示广告的效果非常好。
CAS
Central Authentication Service,中央认证服务,一种独立开放指令协议。CAS 是耶鲁大学(Yale University)发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。
协议特点:
开源的企业级单点登录解决方案。
CAS Server 为需要独立部署的 Web 应用。
CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等语言编写的各种web应用。
CAS属于Apache 2.0许可证,允许代码修改,再发布(作为开源或商业软件)。
SSO
Single Sign On(简称SSO)。简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是比较流行的。
SSO不是一种协议,而是一种登录的设计方式。上面罗列的JWT、OAuth、SAML、OIDC、WebAuth和CAS都可以作为SSO的方案。




