对于webapi服务应用很多时候需要制订访问限制,在前面的章节也讲述了组件如何制订控制器访问控制;但到了实际应用要自己去编写还是比较麻烦。为了让访问控制更方便组件实现基于JWT的控制器访问控制组件BeetleX.FastHttpApi.Jwt;通过这个组件可以轻易地集成访问控制功能。
配置
先需要引用BeetleX.FastHttpApi.Jwt扩展组件,然后针对HttpApiServer调用UseJWT扩展方法即可。
static void Main(string[] args) { HttpApiServer server = new HttpApiServer(); server.Register(typeof(Program).Assembly); server.Options.Port = 80; server.Options.LogLevel = EventArgs.LogType.Info; server.Options.LogToConsole = true; server.Options.SSL = true; server.Options.CertificateFile = "ssl.pfx"; server.Options.CertificatePassword = "123456"; server.UseJWT(); server.Open(); System.Threading.Thread.Sleep(-1); }
当配置了JWT访问控制后,所有请求的api都会返回401错误
使用
组件提供了AuthMark用于标记控制器的针对JWT的验证情况,默认不标记的方法请求时都必须在Cookie:__beetlex_token或Header:Authorization中提供合法的JWT凭证信息。如果想某个方法不参与验证可以标记上[AuthMark(AuthMarkType.NoValidation)]。
[Controller]class Webapi{ [AuthMark(AuthMarkType.Admin)] public object ListEmployee(string jwt_user, string jwt_role, IHttpContext context) { context.Server.Log(EventArgs.LogType.Warring, context.Session, $"{jwt_user}[{jwt_role}]"); return Northwind.Data.DataHelper.Defalut.Employees; } public object List(string jwt_user, string jwt_role, IHttpContext context) { context.Server.Log(EventArgs.LogType.Warring, context.Session, $"{jwt_user}[{jwt_role}]"); return Northwind.Data.DataHelper.Defalut.Customers; } [AuthMark(AuthMarkType.NoValidation)] public string Login(string name, string pwd, IHttpContext context) { string result; if (name == "admin") { result = context.SetAdminJwtToken(name); } else { result = context.SetJwtToken(name, "user"); } return result; }}
以上控制器有三个方法
Login
该方法是把登陆信息写入Cookie并返回,此方法标记了 [AuthMark(AuthMarkType.Admin)],因此无须提供JWT凭证即可访问。
ListEmployee
该方法需要凭证访问,并明确凭证中的角色是admin.
List
该方法需要提供凭证访问
在访问的时候需可以通过访问Login来获取凭证,如果是网页请求则无须返回,SetJwtToken方法会把凭证写到Cookie中,接下来的请求会通过Cookie传递到服务处理。如果是其他途径访问,则需要把凭证设置到Header部的Authorization中;不管是那种方式提供凭证组件都能兼容处理。
当凭证有效的情况,组件会把jwt_user和jwt_role注入到数据上下文中,这两个信息分别是JWT凭证中用户和角色;如果有需要直接在参数中定义相关变量名称即可获取。
Postman调用测试
获取凭证
调用List
由于角色不是admin,因此访问ListEmployee会返回401错误。接下来使用admin用户登陆一次就可以正常访问ListEmployee方法了.
修改配置 使用插件后会在程序中生成beetlex_jwtconfig.json文件{ "Issuer": null, "Audience": null, "JWTKeyED": "m60IIS4+DQR8K9eh0gjrlJPFvB042RyGhtS2jOHjSzyx4T7dZVBCAm51k9+fTEC1Ux066AH198KQgZpZh4Ejmd+a7/DKDi9Dg7quwkU85jmUADnEqGM7vOl8TOO16HrtUfoABVxQ60Tt92RGRjV8VJthxYdIX/B7XjMGTsJLjpo="}
以上信息在初始化的时候随机生成,可以根据自己需求进行更改。下载示例链接:https://pan.baidu.com/s/1ZP600HkfBc57O0gtv7npVA
提取码:3oik
【BeetleX通讯框架代码详解】
BeetleX
开源跨平台通讯框架(支持TLS)
轻松实现高性能:tcp、http、websocket、redis、rpc和网关等服务应用
https://beetlex.io
如果你想了解某方面的知识或文章可以把想法发送到
henryfan@msn.com|admin@beetlex.io