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