對於很任何多開發者來說,不管是使用任何一種框架,或者是使用任何一種語言,都要使用面向接口編程。使用面向接口編程的時候,那么就會有很多的權限驗證,用戶驗證等等。
特別是對於一些系統來說,別人想要對接你的系統,同步系統數據,那么就必須要提供對外訪問接口。當然,這對外接口也不是隨隨便便就提供的,對於一些機密數據,那么對於別人想要使用你的數據,那么必須按照一個標准來。我系統對外提供接口,想要用這個接口必須要通過身份認證才行。舉個很簡單的例子:你想去我家,你必須經過我的同意和我給你的鑰匙你才可以進去。在程序中,接口也是這個道理。有的接口也要通過身份認證,專業一點的說法就是token驗證。
最近幾天,我就遇到了要寫對外接口給別人的一個任務,使用的開發語言是C#,不管使用的是任何語言,實現的原理都是一樣的。在ASP.NET MVC 上,webapi是用來寫接口最佳利器。
接下來是我寫了一個簡單的接口授權驗證的實例。
public class AuthFilterAttribute : Attribute, IAuthenticationFilter { /// <summary> /// AllowMultiple /// </summary> public bool AllowMultiple => true; /// <summary> /// 登錄授權驗證 /// </summary> /// <param name="context"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) { try { var authHeader = context.Request.Headers.Authorization; if (authHeader != null && authHeader.Scheme == TokenAuthentication.Scheme) { var Parameter = authHeader.Parameter; if (!string.IsNullOrEmpty(Parameter) && Parameter != "null" && Parameter != "undefined") { var x = TokenAuthentication.DecryptUserInfo(Parameter); //用戶名登錄驗證 bool result = xx類.xxx方法(x.UserName, x.secretKey);//這里是驗證接口用戶的地方,token是放在請求頭里面里面用加密方式轉過了的 if (result) { // 接口用戶已授權認證通過 這里是對webapi里面的接口方法進行授權驗證,后台控制用戶只能訪問接口中指定的接口方法。 var claims = new List<Claim>(); claims.Add(new Claim(ClaimTypes.Name, x.secretKey)); var data = JsonConvert.SerializeObject(sp_portuserjurisdictionbll.AuthorizeList(x.secretKey)); JArray jObject = JArray.Parse(data); foreach (JObject jProperty in jObject) { //添加接口方法權限 claims.Add(new Claim(ClaimTypes.Role, jProperty["authorizename"].ToString())); } var token = new ClaimsIdentity(claims, TokenAuthentication.Scheme); context.Principal = new ClaimsPrincipal(new ClaimsIdentity[] { token }); } } } } catch (Exception e) { throw e; } return Task.FromResult(0); } /// <summary> /// 質詢 /// </summary> /// <param name="context"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) { return Task.FromResult(0); } }
接下來就是把驗證放到webapi控制器里面了
[AuthFilter]//用戶驗證 這個就是什么的接口用戶驗證 [RoutePrefix("api/xxxx")] public class xxxController : ApiController { /// <summary> /// 查詢學生基本信息接口 /// </summary> /// <param name="model">查詢參數實體</param> /// <returns></returns> [HttpGet] [Authorize(Roles = "StudentTable-GetStudengMessage")] //接口授權驗證 claims 里面包含了"StudentTable-GetStudengMessage"這個的值,那么這個接口方法就可以調用
[Route("")]
public 學生信息實體 FindStudent([FromUri] Parameter model) {
return xxx.FindStudent(model.name, model.age);
}
}
忘了一件事情
一定要在webapiconfig.cs Register 方法里面加上 接口身份認證篩選器
// 身份認證篩選器。 config.Filters.Add(new AuthFilterAttribute()); //剛剛寫好的接口認證類
一個簡單的接口身份認證,接口方法訪問權限就已經做好了。