在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特性即可。
欢迎大家留言,如有不对之处,请指出。