统一的认证与授权
现阶段,前后端分离已是一种非常流行的开发方式,后端以WebApi方式对外提供数据。
对于后端服务而言,它的调用方其实有3大类:
- 运行在浏览器的前端JS代码
- 集群内的其它服务
- 第三方应用程序
对应的调用方的身份有2大类:
- 真实的用户(人)
- 代码调用的HttpClient(对应后面2类)
在微服务架构下,服务的调用链会非常复杂,比如:
Nebula提供了一种 统一的认证与授权 方案,用来解决这2个问题:
- 不同形式的客户调(调用方)
- 微服务的复杂调用链
具体包含以下方面:
- 不论何种调用方(客户端),统一用 IUserInfo 来表示身份,最后封装成 JWT-Token
- JWT-Token可以通过3种方式传递
- Cookie
- 自定义请求头,例如:x-token: xxxxxxxxxxxxxxxxxx
- 标准请求头,例如:Authorization: Bearer xxxxxxxxxxxxxxxxxx
- JWT-Token可以通过3种方式传递
- 微服务相互调用时,自动传递 JWT-Token
- 因此每个服务都可以知道当前的用户身份
- 在服务端的Controller/Action上,使用 [Authorize(....)] 来执行授权检查
- 没有[Authorize(....)]标记表示不做授权检查
实现过程
大致分类3个步骤:
- 创建登录表2个:用户表 和 客户端应用表
- 用户表:每行记录表示一个现实世界中的用户,有登录名,用户名,密码,角色... 这些字段
- 客户端应用表:每行记录表示一个 第三方 客户端,通常包含 AppName, AppId, LoginKey... 这些字段
- 登录检查时
- 普通用户:登录名和密码验证通过后,创建一个 WebUserInfo 对象
- 第三方客户端:AppId/LoginKey验证通过后,创建一个 AppClientInfo 对象
- 然后调用 AuthenticationManager.Login 方法来生成登录凭证(JWT-Token)
- Controller/Action的授权检查
- 请参考 授权检查