LinkCoreX的接口的鉴权设计,提供了很简单的使用方式。 关键字: 鉴权,接口
加密
在配置文件 app.config.json 增加了 AESKEY 的参数
{
  //系统配置
  "System": {
    //端口
    "Port": 8088,
    //自动启动插件
    "AutoStartPlugin": [ "XikewV3" ],
    //"ERROR" ,  "WARN" ,  "INFO" , "DEBUG"  , "SYSTEM" 
    "Logger_Level": "DEBUG",
    //ISecurity.AESKEY  为空时自动生成 32 位字符串
    "AESKEY": ""
  },
  //... 省略其他
}
这个 KEY 是通行密钥对称加密的钥匙,所以要妥善保管。你也可以在项目里设置自有的 KEY。
HttpSecurityAbstract 鉴权抽象类
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public abstract class HttpSecurityAbstract: Attribute, IHttpSecurity
{
    public enum AuthEnum { }
    public AuthEnum Auth { get; set; }
    public string Name { get; set; }
    public ISecurity.Type Type { get; set; } = ISecurity.Type.BearerAuth;
    public string AESKEY { get; set; }
}
public interface ISecurity
{
    public enum Type
    {
        ApiKey,
        BearerAuth,
    }
}
以上代码使得我们了解到,抽象类内置了一个枚举用于存储不同的角色,而 Type 提供了目前主流的两种鉴权方式
实例说明
我们可以先创建一个继承鉴权抽象类的自有类,并设计好不同的权限角色
public class XKAuthorization : HttpSecurityAbstract
{
    new public enum AuthEnum
    {
        游客 = 0,
        普通用户 = 1,
        超级管理员 = 10
    }
}
在用户登录成功后创建一个通行密钥,如果你当前类继承了 ApiController
internal class User : ApiController
{
    public IActionResult PostLogin(string username, string password)
    {
        //... 省略逻辑代码 
        //user 是 继承 IHttpSecurity 的一个类
        var token = CreateAuthData(user);
        //... 省略逻辑代码
    }
}
如果你有兴趣也可以了解下 User 类
using LinkCore.Interface;
using LinkCore.Interface.ORMX;
using System.Text.Json.Serialization;
namespace XikewV3.Model
{
    [ORMXTable(Name = "User", Prefix = "V3_")]
    class User : BaseAbstract, IHttpSecurity
    {
        [ORMXColumn(Comment = "用户名", Length = "36")]
        public string UserName { get; set; }
        [ORMXColumn(Comment = "头像", Nullable = true)]
        public string Avatar { get; set; }
        [ORMXColumn(Comment = "密码", Length = "36")]
        public string Password { get; set; }
        [ORMXColumn(Comment = "角色", Length = "5")]
        public XKAuthorization.AuthEnum Role { get; set; }
        [ORMXColumn(Comment = "登录凭证", Length = "36", Nullable = true)]
        public string Token { get; set; }
        [JsonIgnore]
        [ORMXColumn(Ignore = true)]
        public HttpSecurityAbstract.AuthEnum Auth { get => (HttpSecurityAbstract.AuthEnum)Role; set { } }
        [JsonIgnore]
        [ORMXColumn(Ignore = true)]
        public string AESKEY { get; set; }
        [JsonIgnore]
        [ORMXColumn(Ignore = true)]
        public string Name { get; set; }
        [JsonIgnore]
        [ORMXColumn(Ignore = true)]
        public ISecurity.Type Type { get; set; }
    }
}
最后你只用在需要的地方进行鉴权判断就可以了,通常我们会放在 ApiController 的 BeforeAction 方法中,如果你忘了这是什么?可以查阅 高阶路由 - 数据流转逻辑
public override LCException BeforeAction()
{
    authorization = CheckAuth<Model.User>(new XKAuthorization { });
    return base.BeforeAction();
}
以上我们就完成了配置内容,你会发现于此同时我们也完成了数据库的用户结构设计:grinning:
接下来我们只用在需要权限控制的地方增加特性说明就好了!
[XKAuthorization(Auth = (HttpSecurityAbstract.AuthEnum)XKAuthorization.AuthEnum.超级管理员)]
public IActionResult PostObsolete(string id, bool obsolete) 
{
    // .... 省略代码
}