XIKEW.COM - 实用教程 - 接口鉴权逻辑 - 实用教程,鉴权,接口 - LinkCoreX的接口的鉴权设计,提供了很简单的使用方式。

接口鉴权逻辑
LINKCORE NETCORE 框架 9/13/2024 3:28:48 PM 阅读:0

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; }
    }
}

最后你只用在需要的地方进行鉴权判断就可以了,通常我们会放在 ApiControllerBeforeAction 方法中,如果你忘了这是什么?可以查阅 高阶路由 - 数据流转逻辑

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) 
{
    // .... 省略代码
}