webapi 拦截器 获取请求参数_webapi 拦截请求获取参数 - CSDN
精华内容
参与话题
  • webapi 获取请求参数

    2019-05-13 01:35:12
    //获取请求消息提数据Stream stream = filterContext.Request.Content.ReadAsStreamAsync().Result;Encoding encoding = Encoding.UTF8;stream.Position = 0;using (var reader = new StreamReader(st...
    //获取请求消息提数据 
    Stream stream = filterContext.Request.Content.ReadAsStreamAsync().Result;
    Encoding encoding = Encoding.UTF8;
    stream.Position = 0;
    using (var reader = new StreamReader(stream, encoding))
    {
    Log.Info(reader.ReadToEnd());

    }


    本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/4894147.html,如需转载请自行联系原作者

    展开全文
  • Asp.net Web Api开发(第一篇) 自定义HTTP消息拦截器,实现统一消息拦截,Token验证,签名验证等。

    拦截器类的实现需要继承DelegatingHandler,借用一张网络上的图,我们要实现的拦截器即图中的Message Handler这一层。

    WebAPI5-2

    上代码:

    /// <summary>
        /// HTTP消息拦截器
        /// </summary>
        public class RequestHandler : DelegatingHandler
        {
            /// <summary>
            /// 拦截请求
            /// </summary>
            /// <param name="request">请求</param>
            /// <param name="cancellationToken">用于发送取消操作信号</param>
            /// <returns></returns>
            protected async override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
            {
                //获取URL参数
                NameValueCollection query = HttpUtility.ParseQueryString(request.RequestUri.Query);
                //获取Post正文数据,比如json文本
                string fRequesContent = request.Content.ReadAsStringAsync().Result;
    
                //可以做一些其他安全验证工作,比如Token验证,签名验证。
                //可以在需要时自定义HTTP响应消息
                //return SendError("自定义的HTTP响应消息", HttpStatusCode.OK);
    
                //请求处理耗时跟踪
                Stopwatch sw = new Stopwatch();
                sw.Start();
                //调用内部处理接口,并获取HTTP响应消息
                HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
                //篡改HTTP响应消息正文
                response.Content = new StringContent(response.Content.ReadAsStringAsync().Result.Replace(@"\\", @"\"));
                sw.Stop();
                //记录处理耗时
                long exeMs = sw.ElapsedMilliseconds;
                return response;
            }
    
            /// <summary>
            /// 构造自定义HTTP响应消息
            /// </summary>
            /// <param name="error"></param>
            /// <param name="code"></param>
            /// <returns></returns>
            private HttpResponseMessage SendError(string error, HttpStatusCode code)
            {
                var response = new HttpResponseMessage();
                response.Content = new StringContent(error);
                response.StatusCode = code;
                return response;
            }
        }

    既然实现了相关的拦截器,那我们得找个地方把它插入到web api的处理流程中去,


    代码插入到WebApiConfig.cs中:

    public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
                config.MessageHandlers.Add(new RequestHandler());
                // Web API 路由
                config.MapHttpAttributeRoutes();
            }
        }
    然后应用该webapi配置

    public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                GlobalConfiguration.Configure(WebApiConfig.Register);
                GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();//设置返回值统一为json
            }
        }

    到此就完成了。自己尝试建个webapi项目测试下吧。

    展开全文
  • c# .net mvc webapi Filters 筛选获取 请求参数和响应内容

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using Grass.Extend;
    
    namespace Grass.Mvc.Infrastructure.Filter
    {
        public class WebApiActionDebugFilter : System.Web.Http.Filters.ActionFilterAttribute
        {
            /// <summary>
            /// 是否开启调试
            /// </summary>
            private bool _isDebugLog = true;
    
            public string DebugId
            {
                set
                {
                    var session = System.Web.HttpContext.Current.Session;
                    if (session != null)
                    {
                        session["RequestDebugId"] = value;
                    }
                }
                get
                {
                    var session = System.Web.HttpContext.Current.Session;
                    if (session != null && session["RequestDebugId"]!=null)
                    {
                        return session["RequestDebugId"].ToString();
                    }
                    return string.Empty;
                }
            }
    
            public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext context)
            {
                base.OnActionExecuting(context);
                //记录请求内容
                if (_isDebugLog)
                {
                    try
                    {
                        var guid = System.Guid.NewGuid().ToString();
                        DebugId = guid;
                        var session = System.Web.HttpContext.Current.Session;
                        var request = System.Web.HttpContext.Current.Request;
                        var keys = request.Form.AllKeys;
                        
                        var task = context.Request.Content.ReadAsStreamAsync();
                        var content = string.Empty;
                        using (System.IO.Stream sm = task.Result)
                        {
                            if (sm != null)
                            {
                                sm.Seek(0, SeekOrigin.Begin);
                                int len = (int) sm.Length;
                                byte[] inputByts = new byte[len];
                                sm.Read(inputByts, 0, len);
                                sm.Close();
                                content = Encoding.UTF8.GetString(inputByts);
                            }
                        }
                        string pars = string.Format("请求:\r\n id = {3};\r\n sessionId = {0};\r\n url = {1};\r\n contentType = {4};\r\n content = {2};"
                            ,""// (session==null)?"...":session.SessionID
                            , request.RawUrl
                            , content
                            , guid
                            , request.ContentType);
    
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
            public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext context)
            {
                base.OnActionExecuted(context);
                //记录请求内容
                if (_isDebugLog)
                {
                    try
                    {
                        var session = System.Web.HttpContext.Current.Session;
                        var task = context.Response.Content.ReadAsStringAsync();
                        var txt = task.Result;
                        string pars = string.Format("响应:\r\n id = {2};\r\n sessionId = {0};\r\n response = {1}"
                            , ""//(session == null) ? "..." : session.SessionID
                            , txt
                            , DebugId);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
            
        }
    }


    展开全文
  • webapi token、参数签名是如何生成的

    万次阅读 2019-08-09 14:43:43
    API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求参数不能被篡改4.请求的有效时间 在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请求都应该...

     

    API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间

     

    在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请求都应该有原则地保障安全性。

    例如这个接口  http://127.0.0.1/api/user/list?type=value 这个获取用户列表信息的请求总不能在地址栏一输入就直接显示信息(虽然有点夸张,不至于阿猫阿狗的信息这么容易get吧),在写webapi接口原则性的基本要求必须得保证数据的安全性和请求的有效性

    在这里我就使用Token+参数签名+时间戳  这三个系统参数来办证请求的有效性(即时100%请求有效,也不能说100%也安全了)。

     

    参数名 必选 类型 作用
    token string 调用方标识,保障其身份是来自本系统认证过的,有效识别用户身份
    sign 否    string 接口参数的key,value的记录,防止参数值被篡改,防止伪装请求
    timestamp f否 int 时间戳,防止重放攻击

     

    那么问题来

     

    1.token 如何生成?作用是什么?

    2.参数签名如何生成?作用是什么?

    3.时间戳的作用是什么?

    看了这篇文章你就知道了。这三个系统参数是如何保证请求的有效性,一定程度上提高数据的安全性

    1.token如何生成的?作用是什么?

    token生成:一般的api基本上主要分为两种客户端访问api的token和需要用户登录之后的token,这里我就来说一下后者,(简单通俗做法)用户登录输入用户名、密码,访问api,验证数据库成功。这个时候可以产生token,失败直接返回。问题又来了!

    1.token生成的方式是什么?2.token存在哪里?3.token如何验证是否正确

    在验证数据成功之后可以获取唯一用户标识(用户名也行),就以username:zhanglin为例吧,对这个标识进行加密(des,MD5、其他的也行,关键数据必须得加密),这个加密之后的字符串就可以做为一个Token了。

    2.token每次请求都需要进行传递,推荐存在cookie,也可以持久化到客户端。现在有这样一个api接口http://127.0.0.1/api/user/list?token=encryptUsernameStr

    这个encryptZhanglinStr就是登录成功后加密的username返回的给客户端,客户端用什么保存这里就不多介绍了,只需要知道返回给客户端一个用户访问的Token类即可,到了服务器端方法验证的时候再进行解密,获取到字符串zhanglin,然后将这个zhanglin与系统用户(可采用缓存数据库、缓存token的值)对比,如果对比存在,则说明有权限去访问api,反之非法的请求。

    还是代码来实现一下吧。代码比较容易理解,就是为了把这个原理说清楚一点

            [Route("login")]
            public bool login(string account, string pwd)
            {
                var obj = Db.dbUsers.FirstOrDefault(f => f.Account == account && f.Pwd == pwd);
                if (obj != null)
                {
                    string token = account.DESEncrypt(desKey);//加密产生token,
                    HttpCookie cookie = new HttpCookie(cookieToken,token);
                    HttpContext.Current.Response.Cookies.Add(cookie);//保存cookie
                    return true;
                }
                else
                {
                    return false;
                }
            }

    token的产生就是登陆之后根据用户标识保存在cookie里,这样在客户端每次发送请求的时候都会带上token这个参数,如下:

            [Route("list"), HttpGet]
            public List<string> List(string  type,string token)
            {
                var obj = Db.dbUsers.FirstOrDefault(p => p.Account == token.DESDecrypt(desKey));
                //验证token
                if (obj != null)
                {
                    //返回数据集
                }
                else
                {
                    //非法请求
                }
            }

     

    3.这样就可以验证token是否正确,一般都是用缓存。

    Token的作用的就是判断请求是否是系统用户发出的,这样能有效识别请求用户的身份信息

    2..参数签名如何生成?作用是什么?

    参数签名sign:为了提高传参过程中,防止参数被恶意修改,在请求接口的时候加上sign可以有效防止参数被篡改,那么sign是如何起作用的呢?

    看看它的生成方法就明白了

     

    比如有这样一个接口http:127.0.0.1/api/product?&type=zl&p1=value1&p2=value2&p3=&sign=signValue

    第一步:拼接参数字符串,除去sign参数本身和为空值的p3,那么剩下的就是字符串type=zl&p1=value1&p2=value2,然后按参数名字符升(降)序,得到字符串

    p1=value1&p2=value2&type=zl

    第二步:然后做参数名和值的拼接,得到字符串p1value1p2value2type=zl,注意编码,不能出现这种&quot; ,要转码后“后拼接

    第三步:将字符串进行DES加密,假设p1value1p2value2type=zl进行des加密后的结果是abc123,最终得到的字符串abc123就是参数sign的值signValue

    第四步:在接口中我们会接收到参数名sign的参数值abc123,然后解密得到字符串p1value1p2value2type=zl,再与接口中参数拼接排序后进行比较,如果不一样则说明参数的循序不一样,参数的值就一定是被修改过了。

    总结:

    1.接口的调用方和接口的提供方统一约定参数加密算法

    2.参数签名就是对参数key ,value的一个记录。参数如果被修改肯定对不上参数签名,就不会调用请求

     

    3.时间戳的作用?

    在api请求的接口,客户端请求的发生时间便是时间戳,这个参数到了服务器,与服务器端时间对比,如果时间间隔较长则无效。

    在asp.net mvc的开发webapi接口时,可以使用mvc的过滤器进行以上三个关键参数的拦截过滤。以下代码是在.net core中实现的,方法还是一样的,都是在进入方法前进行拦截,这是一个登录的api。

    返回api结果是一个类ApiResult.cs,序列化成json对象,该类包含两个泛型方法请求成功的Ok方法,请求失败的Error方法

    public class MyFilterAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var request_param = context.ActionArguments.Values;
                var  queryCollection = context.HttpContext.Request.Query;
                string account = string.Empty;
                string password = string.Empty;
                long timespan = 0;
                string signature = string.Empty;
                try
                {
                    account = queryCollection.Where(p => p.Key == "account").Select(f => f.Value).FirstOrDefault().ToString();
                    password = queryCollection.Where(p => p.Key == "password").Select(f => f.Value).FirstOrDefault().ToString();
                    timespan = long.Parse(queryCollection.Where(p => p.Key == "timespan").Select(f => f.Value).FirstOrDefault().ToString());
                    signature = queryCollection.Where(p => p.Key == "signature").Select(f => f.Value).FirstOrDefault().ToString();
                }
                catch (Exception ex)
                {
                    var apiresult = ApiResult<bool>.Error("参数异常"+ex.ToString());
                    context.Result = new JsonResult(apiresult);
                }
                //var accountName = context.RouteData.Values["accountName"].ToString()
                var expires_minute = (timespan - DateTime.Now.Ticks) / 60000000000;
                if (expires_minute> 10||expires_minute<-10)
                {
                    var apimodel = ApiResult<bool>.Error("请求超时"+expires_minute);
                    //var json = JsonConvert.SerializeObject(apimodel);
                    JsonResult ret = new JsonResult(apimodel);
                    context.Result =ret;
                }
                var ok = ("account" + account + "password" + password).Contains(signature);//ToDO 加密解密
                if (ok == false)
                {
                    var apimodel = ApiResult<bool>.Error("非法请求");
                    var json = JsonConvert.SerializeObject(apimodel);
                    JsonResult ret = new JsonResult(apimodel);
                    context.Result = ret;
                }
                base.OnActionExecuting(context);
            }
    
        }


    作者:张林
    原文标题: webapi token、参数签名是如何生成的
    原文链接:http://blog.csdn.net/kebi007/article/details/72861532
    转载随意注明出处

     有兴趣的可以关注一下我的微信公众号[dotNet全栈开发],分享一些编程相关的经典文章

     

    展开全文
  • 文本主要介绍三种方式来对api进行拦截,参考本文可实现拦截api,进行一些附加操作,比如打印拦截到的方法所在类名,获取原始的request,拦截api的调用的方法名,还可以根据需要实现打印出方法的参数。当然,下面...
  • SpringBoot开发Restful API请求拦截

    千次阅读 2018-06-12 18:04:16
    需求背景:记录所有Restful API 的处理时间 过滤(Filter) 编写一个Fileter并注入到Spring容器中 @Component public class TimeFIlter implements Filter { @Override public void init(FilterConfig ...
  • public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ... // 所有请求第一个进入的方法 String reqURL = request.getRequestURL().toString(); Strin
  • 最近有一个需要从拦截器获取post请求参数的需求,这里记录一下处理过程中出现的问题。 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取到参数,post是不行的,后来想到了使用...
  • 在asp.net mvc 中 webapi 和 mvc 处理消息是两个不同的管道,Asp.net mvc 和 webapi 为我们提供的 ActionFilterAttribute 拦截器,通过 重写 OnActionExecutingAsync,来 拦截action的请求消息,当执行...
  • web api添加拦截器

    千次阅读 2018-04-28 09:41:35
    1.标识控制拦截特性; 2.控制器拦截处理; 代码实现 1.标识控制拦截特性,代码: [MyFilter] public string PostFindUser([FromBody]Userinfo user) { return string.Format("{0}是好人~", user....
  • 在前面的一些文章中我们有讲到,通过拦截器我们可以做很多的事情,包括接口的统一的 参数校验、 登录校验、权限校验等,也可以做一些HTTP响应体写入,比如我们另一篇文章所说的《解决跨域问题》,本篇我们也就是讲解...
  • 1.权限(AuthorizationFilters)验证中读取并只读取有一次请求串的方法 HttpRequest request = context....// post请求方式获取请求参数,.net core 2.0 不支持.Form 直接获取 Stream stream = request.Body; ...
  • Springboot 实现api校验和登录验证

    千次阅读 2018-11-08 18:00:48
    在前后端分离开发时,后端获取数据就是通过异步请求调我们的API接口,但是,如果我们不做安全处理,其他人也可以直接调我们的API,这会让我们的数据泄露。因此,为了让我们的API只能被我们允许的人调用,我们对我们...
  • Servlet Filter(过滤)、Filter是如何实现拦截的、Filter开发入门 Filter简介 Filter也称之为过滤,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:...
  • WebApi安全性 使用TOKEN+签名验证

    千次阅读 2017-10-18 16:23:41
    首先问大家一个问题,你在写开放的API接口时是如何保证数据的...请求参数被篡改?请求的唯一性(不可复制),防止请求被恶意攻击 为了保证数据在通信时的安全性,我们可以采用TOKEN+参数签名的方式来进行相关验证。
  • Spring MVC配置及拦截器的实现

    万次阅读 2016-07-15 10:18:05
    如题所示,这里主要是介绍拦截器的使用了但是为了更贴合实际的项目所以我们先导入spring mvc框架。为了使用spring mvc我们要导入相关的包,它依赖于spring-web 和spring -webmvc我这里的版本是4.0.6的。将相关的包...
  • JS HTTP 请求终极解决方案 - fly.js

    万次阅读 2017-10-24 14:09:59
    Fly.js 是一个功能强大的轻量级的javascript http请求库,同时支持浏览器和node环境,通过适配器,它...同时fly.js有一些高级的玩法如全局ajax拦截、在web app中支持请求重定向等,耐心看下去,它会给你足够的惊喜。
  • Spring之attribute与parameter对比

    万次阅读 2019-12-28 22:18:06
    前阵子在学习拦截器的时候,有一个非常有趣的应用:计算API从调用到返回的耗时。这个时候我们通常在preHandle()方法的HttpServletRequest参数对象上调用setAttribute()方法,将其实时间存入,在afterCompletion()...
  • postman 拦截重发 HTTP 请求   类似于 Fiddler, postman 也可以实现对于 HTTP 请求拦截,native app 和 chrome app 实现的方式不太一样,native app 是通过内建代理服务器实现的,chrome app 是通过 Postman ...
1 2 3 4 5 ... 20
收藏数 27,235
精华内容 10,894
关键字:

webapi 拦截器 获取请求参数