博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webapi使用过滤器拦截客户端传来的参数
阅读量:4953 次
发布时间:2019-06-11

本文共 4866 字,大约阅读时间需要 16 分钟。

项目是前端和后端分离的,想在服务器上拦截客户端传上来的参数,然后做进一步处理,如:权限,验证是否登录,或者其他的

1.添加新类:OperationAttribute,用来做权限验证的

代码如下:

///     /// 判断是否有权限访问某操作    ///     public class OperationAttribute:ActionFilterAttribute    {        public override void OnActionExecuting(HttpActionContext actionContext)        {            var parmethod = actionContext.Request.Method;            string method = parmethod.Method;            dynamic model = CommonTools.SessionHelper.GetSession("UserInfo");            int UserId = model.UserId;            int IsSuper = model.IsSuper;            string ActionLogo = "";            if (method.ToLower() == "post")//post提交的时候            {                //post提交的参数                var task = actionContext.Request.Content.ReadAsStreamAsync();                var content = string.Empty;                using (Stream sm = task.Result)                {                    sm.Seek(0, SeekOrigin.Begin);//设置流的开始位置                    var bytes = sm.ToByteArray();                    content = bytes.ToStr();//此处就是客户端出来的参数                }                dynamic obj = CommonTools.JsonHelper.DeserializeJsonToObject
(content);//序列化为对象 ActionLogo = obj.ActionLogo == null ? "" : obj.ActionLogo;//获取前端传过来的动作标识 } else { //get提交获取参数 var qs = HttpUtility.ParseQueryString(actionContext.Request.RequestUri.Query); if (qs.Count > 0) { string[] keys = qs.AllKeys; if (keys.Contains("ActionLogo")) { ActionLogo = qs["ActionLogo"]; } } } IsVisit(UserId, IsSuper, ActionLogo, actionContext);//开始验证 } public void IsVisit(int UserId, int IsSuper, string ActionLogo, HttpActionContext actionContext) { if (IsSuper == 1)//超级管理员不需要验证 { base.OnActionExecuting(actionContext); } else { if (ActionLogo =="") { actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.InternalServerError, new { code = "1", data = "", message = "您无权限进行此操作" }); } else { //进行下一步判断 } } } }

2.添加一个公共类,用来处理post参数

public static class Common     {        ///         /// 转为byte数组        ///         ///         /// 
public static byte[] ToByteArray(this Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始  stream.Seek(0, SeekOrigin.Begin); return bytes; } /// /// 转为字符串 /// /// ///
public static string ToStr(this byte[] arr) { return Encoding.Default.GetString(arr); } }

之所以要这样写,是为了防止过滤器重叠的时候,post提交获取不到参数。

写好过滤类之后,直接在方法,或者控制器上使用,

[Operation]加在方法上,就可以验证方法的权限,加在控制器上,就可以验证控制器下所有的方法,若在控制中有不需要验证的方法,可以在OnActionExecuting上加上:

if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())

{
return;
},

然后在不需要验证的方法上调用[AllowAnonymous],

如登录方法:

[AllowAnonymous]        [HttpGet]        public HttpResponseMessage Login(string UserName, string UserPwd)        {            string jsonresult = "";            List OperationResult = db.Login(UserName, UserPwd);            switch (OperationResult[0].ToString())            {                case "0":                    jsonresult = "{\"State\":0,\"err\":\"10001\",\"info\":\"登录出错\"}";                    break;                case "-1":                    jsonresult = "{\"State\":0,\"err\":\"10002\",\"info\":\"密码错误\"}";                    break;                case "-2":                    jsonresult = "{\"State\":0,\"err\":\"10003\",\"info\":\"用户名不存在\"}";                    break;                default:                    User model = (User)OperationResult[1];                    CommonTools.SessionHelper.SetSession("UserInfo",model);                    jsonresult = "{\"State\":1,\"err\":\"10000\",\"info\":\"登录成功\",\"LoginInfo\":{\"UserInfo\":{\"UserName\":\"" + model.UserName + "\",\"UserId\":" + model.UserId + "}";                    string jsonstr = OperationResult[2].ToString();                    jsonresult += ",\"MenuInfo\":" + jsonstr;                    jsonresult += "}}";                    break;            }            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(jsonresult, Encoding.GetEncoding("UTF-8"), "application/json") };            return result;        }

这样登录的方法就绕过了验证

转载于:https://www.cnblogs.com/PiaoYu/p/11386295.html

你可能感兴趣的文章
MongoDB在windows下安装配置
查看>>
Upselling promotion stored procedure
查看>>
mysql编码配置
查看>>
KVM地址翻译流程及EPT页表的建立过程
查看>>
sigar
查看>>
iOS7自定义statusbar和navigationbar的若干问题
查看>>
c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码...
查看>>
程序员如何提高影响力:手把手教你塑造个人品牌
查看>>
身份证校验原理和PHP实现
查看>>
[Locked] Wiggle Sort
查看>>
deque
查看>>
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>
python--迭代器与生成器
查看>>
SQL之case when then用法详解
查看>>
STL 排序函数
查看>>
Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络...
查看>>
Setting up a Passive FTP Server in Windows Azure VM(ReplyCode: 227, Entering Passive Mode )
查看>>
Atitit mtp ptp rndis midi协议的不同区别
查看>>
Ajax辅助方法
查看>>
Python模块调用
查看>>