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()); //剛剛寫好的接口認證類

  一個簡單的接口身份認證,接口方法訪問權限就已經做好了。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM