Asp.Net web api基於自定義Filter的安全認證

else發表於2021-09-09

摘要

對第三方開放的介面,處於安全的考慮需要對其進行安全認證,是否是合法的請求。目前在專案中也遇到這種情況,提供的介面因為涉及到客戶銘感資料,所以在呼叫的時候,不能直接暴露,需要有一個認證的機制。所以對介面安全認證的方式,進行了調研,這裡提供一個自定義安全認證的Filter例子。

一個例子

在mvc中,如果需要對某個頁面如果使用者不登入則無法訪問,我們的做法可能是校驗session或者使用特性[Authorize]

    [Authorize]    public class UserController : Controller
    {        // GET: User
        public ActionResult Index()
        {            //if (Session["user"]==null)            
        //{            //    return RedirectToAction("login");            
        //}
            return View();
        }
    }

在mvc中,這種認證方式基於windows或者form認證。但在提供web api給移動端app呼叫的時候,windows或者form認證就不太合適了。但我們可以自定義一種filter對當前訪問的使用者進行認證。

自定義Filter特性

    /// 
    /// 基於http basic認證    /// 
    public class CustomerBasicAuthrizeAttribute : AuthorizationFilterAttribute
    {        //重寫OnAuthorization 方法

        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {            //如果action帶有允許匿名訪問的特性,則直接返回,不再進行安全認證
            if (actionContext.ActionDescriptor.GetCustomAttributes().Any())
            {                return;
            }            if (actionContext.Request.Headers.Authorization != null)
            {                if (actionContext.Request.Headers.Authorization.Scheme != "Basic")
                {
                    actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,                        new HttpException("no token"));
                }                else
                {                    string base64Para = actionContext.Request.Headers.Authorization.Parameter;                    
                //解碼base64字串
                    byte[] buffer = Convert.FromBase64String(base64Para);                    
                    string decodeBase64 = Encoding.UTF8.GetString(buffer);                    
                    if (!string.IsNullOrEmpty(decodeBase64))
                    {                        string[] paras = decodeBase64.Split(':');                        
                    if (paras.Length > 0)
                        {                            string userName = paras[0];                            string pwd = paras[1];                            if (userName == "wolfy" && pwd == "123456")
                            {
                            }                            else
                            {
                                actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,                                    new HttpException("userName or pwd is error."));
                            }
                        }                        else
                        {
                            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,                                new HttpException("no token"));
                        }

                    }                    else
                    {
                        actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,                            new HttpException("no token"));
                    }
                }

            }            else
            {
                actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,                   
                 new HttpException("no Authorization header"));
            }            base.OnAuthorization(actionContext);
        }
    }


使用postman測試

圖片描述

認證成功

圖片描述

第三方呼叫的時候,可以為其生成一對appname和appsecret放在供客戶端進行使用。客戶端使用的時候在請求頭的Authorization中新增base64字串就可以了。對於basic對應的值,是base64字串,如果感覺還不安全可以嘗試使用SSL方式。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2318/viewspace-2800996/,如需轉載,請註明出處,否則將追究法律責任。

相關文章