在webapi接口开发过程中,安全显得尤为重要,因为有时候我们的数据接口可能不是任何人都能看的,比如我在的这家公司,集成了一大堆的公开接口,其中包含身份证实名认证、短信发送、手机号码识别等等一系列的接口,公司又是根据角色划分接口权限,这时候接口权限显得尤为重要了。
我们项目里面用的是basic授权方式,其思路是用户每次到提供的接口获取accesstoken,用账号和密码获取,在反悔的时候设置好当前的有效期。代码如下。
1 public JsonResult GetAccessToken([FromBody]User user) { 2 try 3 { 4 FormsAuthenticationTicket authenticationTicket = 5 new FormsAuthenticationTicket(1, user.userName, DateTime.Now.AddMinutes(5), DateTime.Now, 6 true, user.userName + ":" + user.password, FormsAuthentication.FormsCookiePath); 7 string ticket = FormsAuthentication.Encrypt(authenticationTicket); 8 return Json(new 9 { 10 success = true, 11 token = ticket 12 }); 13 } 14 catch (Exception ex) { 15 return Json(new { 16 success = false, 17 token = ex.Message 18 }); 19 } 20 }
这样就返回给客户端,然后客户端每次获取接口的时候在Header的Authorization设置为用户名加上token(格式为:userName+\' \'+token)
在服务端写一个过滤器,继承AuthorizeAttribute,重写OnAuthorization方法,这个是在每次请求服务端接口之前授权验证的方法,然后重写这个方法,代码如下:
public class ApiAuthAttribute : AuthorizeAttribute { public override void OnAuthorization(HttpActionContext actionContext) { //忽略不加权限访问得接口 if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(true).Count > 0 || actionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(true).Count>0 ) { //忽略那些公共得接口,不需要验证的 即在函数或者控制器上面加上一个AllowAnonymous特性 base.OnAuthorization(actionContext); } else if (actionContext.Request.Headers.Authorization.Parameter == null || actionContext.Request.Headers.Authorization.Scheme == null) { //这里之验证了Authorization,实际应该拿到actionContext.Request.Headers.Authorization.Parameter里面的对象参数做逻辑处理。。。。 FormsAuthenticationTicket ticketInfo= FormsAuthentication.Decrypt(actionContext.Request.Headers.Authorization.Parameter); //ticketInfoj就是生成token时候设置得参数 base.HandleUnauthorizedRequest(actionContext); } else { //f返回未授权 base.IsAuthorized(actionContext); } } }
至此,接口权限功能就已经加上了,调用只需在控制器或者方法上面加上ApiAuth特性即可。
欢迎大家留言,如有不对之处,请指出。