zhoutuan

  在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特性即可。

 

  欢迎大家留言,如有不对之处,请指出。

分类:

技术点:

相关文章: