????????對于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方法了.
{ "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