认证
目前的认证体系使用的是SSO,对应的Nuget包是Aegis.Authorization.SSO
,目前提供的版本是2.0.3
同时还需要引入Aegis.Core.Authorization
,这个包提供了CurrentUser
、TokenHanlder
等基本认证处理类。
启用认证和鉴权
在Component.deps.json
中的Services节点中确定包含了Authorization
注意此时只是开启了基础认证和鉴权,请确保引用认证和鉴权的实现组件,否则会报错。
现有 SSO认证&鉴权组件可供使用
如果确定要使用SsoAuthorize
,请在Component.deps.json
且中也包含它,且SsoAuthorize
顺序应该在Authorization
后面。
请确保在AppSettings或者加载的配置文件中包含SsoAuthorize节点的配置,具体如下:
"SSOAuthorize": {
"Host": "http://10.11.13.75:30010/", //SSO 远程路径
"AppCode": "", //系统Code
"UserCode": "sys", //接口用户名
"Password": "App1234." //接口密码
},
如何获取当前用户
前端在请求接口的时候加入对应的HeaderAuthorization
,并且传入具体的Token,表现为Bearer开头的Token
Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJJU1MiOiJTU08iLCJTVUIiOiJwdWJsaWMiLCJJQVQiOiIxNjk0NTk4NjQ2IiwiRVhQIjoiMjAxMDI0NjY0NiIsIkpUSSI6ImUzYmJlMTVkLTk5NmUtNGM1Ni05MmZjLTA4NTU4Y2UxYzMwMSJ9.FILF7psfjlp61P9mDmrHH3ZlCj9AtsnY2dA1yhEAEPk
在传入Token后,只要该Token对应的用户确实已登录,后端就能通过CurrentUser.Value
准确的获取到对应的登录用户。对应的数据结构如下
public class CustomeUser
{
/// <summary>
/// 用户唯一标识
/// </summary>
public string UserIdentity { get; set; }
/// <summary>
/// 具体Token
/// </summary>
public string Token { get; set; }
/// <summary>
/// 过期时间
/// </summary>
public DateTime ExpireAt { get; set; }
/// <summary>
/// 自定义用户信息
/// </summary>
public object UserInfo { get; set; }
}
使用CurrentUser.Value.UserInfo
就能获取到ISsoUserAdapter
适配后的用户信息。也就是说这里的UserInfo实际上就是上面SsoUserAdapter.GetUser
的返回值。
在Aegis.Authorization.SSO
中提供了扩展方法支持CurrentUser.Value.SsoUser()
的方法来快速获取SsoUser用户实例。本质上是将CurrentUser.Value.UserInfo
转换为SsoUserModel
。所以只需要调用一次并存起来就行。
用户自定义字典
Aegis.Core.Authorization
为用户提供了额外信息存储的方式,方便业务系统存储用户的额外信息。用法如下,对应的value处存储的是object类型,注意在存储值类型的时候就会出现装箱拆箱的情况,请尽量传递引用类型进去。
CurrentUser.Value.Set("keyName",1); //设置内容,如果传值类型会触发装箱
var number = CurrentUser.Value.Get("keyName"); //获取内容
认证失败与过期机制
当使用[ApiAuthorize]
标注Controller或者对应的控制器方法后,如果框架获取不到当前用户CurrentUser.Value
获取不到数据的情况下,会返回Http状态码为401的错误信息,告知前端需要跳转登录页面。
使用[AllowAnonymous]
标注即可在没有Token的情况下进入方法内,常用与登录和用户信息设置。
目前框架内的ApiControllerBase全都带上了[ApiAuthorize]
,之后会去掉。
目前的SSO没有过期机制,之后会接入过期与刷新。
如何扩展
当前认证体系可以接入大量扩展,提供以下接口供扩展
接口名 | 用途 |
---|---|
IUserManagaer | 用户数据储存管理接口,当前认证后的用户的管理接口,比如默认就是存在内存里,之后还可以扩展存在Redis里、数据库里等 |
IAuthorizeManager | 具体认证管理接口,用于提供具体的认证流程,目前只提供了SSO的认证管理 |
开发模式快速验证
在DEBUG模式下,可以使用简单Token来直接通过认证和鉴权,目前可以直接传入1
来快速获取一个UserName为1的Fake用户。
DEBUG模式下依然支持使用正常用户查询,在RELEASE模式下只能通过正常鉴权。
版本支持需求:
- Aegis.Core.Authorization > 2.0.2-preview1
- Aegis.Authorization.SSO > 2.0.3