统一的认证与授权

现阶段,前后端分离已是一种非常流行的开发方式,后端以WebApi方式对外提供数据。
对于后端服务而言,它的调用方其实有3大类:

  • 运行在浏览器的前端JS代码
  • 集群内的其它服务
  • 第三方应用程序

对应的调用方的身份有2大类:

  • 真实的用户(人)
  • 代码调用的HttpClient(对应后面2类)

在微服务架构下,服务的调用链会非常复杂,比如:

xx

那么,这种场景下的 身份认证授权检查 该如何实现呢?



Nebula提供了一种 统一的认证与授权 方案,用来解决这2个问题:

  • 不同形式的客户调(调用方)
  • 微服务的复杂调用链

具体包含以下方面:

  • 不论何种调用方(客户端),统一用 IUserInfo 来表示身份,最后封装成 JWT-Token
    • JWT-Token可以通过3种方式传递
      • Cookie
      • 自定义请求头,例如:x-token: xxxxxxxxxxxxxxxxxx
      • 标准请求头,例如:Authorization: Bearer xxxxxxxxxxxxxxxxxx
  • 微服务相互调用时,自动传递 JWT-Token
    • 因此每个服务都可以知道当前的用户身份
  • 在服务端的Controller/Action上,使用 [Authorize(....)] 来执行授权检查
    • 没有[Authorize(....)]标记表示不做授权检查



实现过程

大致分类3个步骤:

  • 创建登录表2个:用户表 和 客户端应用表
    • 用户表:每行记录表示一个现实世界中的用户,有登录名,用户名,密码,角色... 这些字段
    • 客户端应用表:每行记录表示一个 第三方 客户端,通常包含 AppName, AppId, LoginKey... 这些字段
  • 登录检查时
    • 普通用户:登录名和密码验证通过后,创建一个 WebUserInfo 对象
    • 第三方客户端:AppId/LoginKey验证通过后,创建一个 AppClientInfo 对象
    • 然后调用 AuthenticationManager.Login 方法来生成登录凭证(JWT-Token)
  • Controller/Action的授权检查