如何在Asp.Net WebApi接口中,驗證請求參數中是否攜帶token標識!


[BasicAuthentication]
    public abstract class ApiControllerBase : ApiController
    {
        #region Gloal Property
        /// <summary>
        /// token_id
        /// </summary>
        public string token_ID { get; set; }

        /// <summary>
        /// user_id
        /// </summary>
        public string user_ID { get; set; }
#endregion

        #region InitializeUser
        protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext)
        {
            user_ID = token_ID = string.Empty;

            #region 【 驗證請求中是否有 token 授權 】
            if (controllerContext.Request.Method != HttpMethod.Get)
            {
                string postContentData = string.Empty;
                string contentType = string.Empty;
                string postTokenStr = string.Empty;
                //----------------獲取Post參數--------------------
                NameValueCollection postParam = null;

                //【處理】content-type:application/x-www-form-urlencoded
                if (controllerContext.Request.Content.IsFormData())
                {
                    postParam = controllerContext.Request.Content.ReadAsFormDataAsync().Result;
                    postContentData = postParam.ToString();
                    postTokenStr = postParam["token"] ?? "";
                    contentType = "application/x-www-form-urlencoded";
                }
                //【處理】 content-type:application/json 
                else
                {
                    contentType = "application/json";
                    if (!controllerContext.Request.Content.IsMimeMultipartContent("form-data"))
                    {
                        postContentData = controllerContext.Request.Content.ReadAsStringAsync().Result;
                        JavaScriptSerializer json = new JavaScriptSerializer();
                        dynamic token = json.Deserialize(postContentData, typeof(object));
                        if (postContentData.Contains("token"))
                        {
                            postTokenStr = Convert.ToString(token["token"]);
                        }
                    }
                    else
                    {
                        contentType = "multipart/form-data";
                        var collPostParamData = controllerContext.Request.RequestUri.ParseQueryString();
                        //----------------同時處理Post中的Url參數請求-------------------------------
                        if (!string.IsNullOrWhiteSpace(collPostParamData["token"]))
                        {
                            postTokenStr = System.Web.HttpUtility.UrlDecode(collPostParamData["token"]);
                        }
                    }
                }
                //----------------設置回FormData參數----------------------
                if (!controllerContext.Request.Content.IsMimeMultipartContent("form-data"))
                {
                   StringContent content = new StringContent(postContentData, Encoding.UTF8, contentType); controllerContext.Request.Content = content;
                }

                this.token_ID = postTokenStr;
                BasicAuthenticationAttribute.isLoginAuth = ValidateCacheToken(postTokenStr);
            }
            else
            {
                var getParam = controllerContext.Request.RequestUri.ParseQueryString();
                //----------------Get請求-------------------------------
                if (!string.IsNullOrWhiteSpace(getParam["token"]))
                {
                    var _getToken = System.Web.HttpUtility.UrlDecode(getParam["token"]);
                    this.token_ID = _getToken;
                    BasicAuthenticationAttribute.isLoginAuth = ValidateCacheToken(_getToken);
                }
            }
            #endregion
            base.Initialize(controllerContext);
     }

注意: controllerContext.Request.Content.ReadAsFormDataAsync().Result 和 controllerContext.Request.Content.ReadAsStringAsync().Result; 只能取,並且取完,后面子類中就獲取不到了,必須就得重新賦值進去,這是我覺得很怪異的地方。

StringContent content = new StringContent(postContentData, Encoding.UTF8, contentType); controllerContext.Request.Content = content;


免責聲明!

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



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