ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在Asp.Net WebApi接口中,验证请求参数中是否携带token标识!

2019-06-30 15:24:41  阅读:178  来源: 互联网

标签:WebApi Asp string postContentData Request Content token controllerContext


[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;

转载于:https://www.cnblogs.com/Kummy/p/3628430.html

标签:WebApi,Asp,string,postContentData,Request,Content,token,controllerContext
来源: https://blog.csdn.net/weixin_34049948/article/details/94324577

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有