ASP.NET MVC WebApi接口授权验证

对于很任何多开发者来说,不管是使用任何一种框架,或者是使用任何一种语言,都要使用面向接口编程。使用面向接口编程的时候,那么就会有很多的权限验证,用户验证等等。

特别是对于一些系统来说,别人想要对接你的系统,同步系统数据,那么就必须要提供对外访问接口。当然,这对外接口也不是随随便便就提供的,对于一些机密数据,那么对于别人想要使用你的数据,那么必须按照一个标准来。我系统对外提供接口,想要用这个接口必须要通过身份认证才行。举个很简单的例子:你想去我家,你必须经过我的同意和我给你的钥匙你才可以进去。在程序中,接口也是这个道理。有的接口也要通过身份认证,专业一点的说法就是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()); //刚刚写好的接口认证类

  一个简单的接口身份认证,接口方法访问权限就已经做好了。

  

posted @ 2018-04-07 23:45  *小嘻嘻*  阅读(7424)  评论(2编辑  收藏  举报