/// <summary>
/// 渠道过滤器
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class ChannelActionFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// 请求接口之前渠道过滤
/// </summary>
/// <param name="actionContext"></param>
public override void OnActionExecuting(HttpActionContext actionContext)
{
var identity = ParseHeader(actionContext);
if (identity == null)
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden,"请求来源未知,没有该接口访问权限。");
return;
}
if (!ValidChannel(identity))
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden, "请求来源未知,没有该接口访问权限。");
}
base.OnActionExecuting(actionContext);
} /// <summary>
/// 渠道验证
/// </summary>
/// <param name="identity">渠道信息</param>
/// <returns></returns>
protected bool ValidChannel(ChannelIdentity identity)
{
ChannelsService svr = new ChannelsService();
try
{
return svr.ValidateChannel(identity.SecretKey, identity.AppKey);
}
catch (Exception ex)
{
Logger.Warn("ChannelActionFilterAttribute[ValidChannel]:渠道来源校验时发生异常", ex);
return false;
} } /// <summary>
/// 获取渠道信息
/// </summary>
/// <param name="actionContext"></param>
protected ChannelIdentity ParseHeader(HttpActionContext actionContext)
{
IEnumerable<string> secretKeys = null;
IEnumerable<string> appKeys = null;
string secretKey = string.Empty;
string appKey = string.Empty;
if(actionContext.Request.Headers.TryGetValues("SecretKey", out secretKeys))
{
foreach (var key in secretKeys)
{
secretKey = key;
break;
}
} if (actionContext.Request.Headers.TryGetValues("AppKey", out appKeys))
{
foreach (var key in appKeys)
{
appKey = key;
break;
}
} if (!string.IsNullOrEmpty(secretKey) && !string.IsNullOrEmpty(appKey))
{
return new ChannelIdentity(secretKey, appKey);
}
return null;
}
}

控制器controller中使用过滤器:

  /// <summary>
/// 用户管理
/// </summary>
[ChannelActionFilter, RoutePrefix("Media/Users")]
public class UsersController : ApiController
{
//todo
}

web api 过滤器的更多相关文章

  1. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  2. ASP.NET Web API 过滤器创建、执行过程(一)

    ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...

  3. Web API过滤器

    Web API包含在操作方法执行之前或之后添加额外的逻辑的过滤器.过滤器可用于提供横切特性,比如日志记录.异常处理.性能测量.身份验证和授权等等. 过滤器可以应用于Web API控制器或一个或多个操作 ...

  4. MVC和Web API 过滤器Filter [转]

    ASP.NET MVC 支持以下类型的操作筛选器: ·        授权筛选器.这些筛选器用于实现IAuthorizationFilter和做出关于是否执行操作方法(如执行身份验证或验证请求的属性) ...

  5. MVC和Web API 过滤器Filter

    MVC和Web API Filter(过滤器) ASP.NET MVC 支持以下类型的操作筛选器: ·        授权筛选器.这些筛选器用于实现IAuthorizationFilter和做出关于是 ...

  6. ASP.NET Web API 2 过滤器

    Ø  前言 我们知道 ASP.NET Web API 过滤器,也是属于消息处理机制中的一部分.正因如此,我们经常使用它来完成对请求的授权验证.参数验证,以及请求的 Log 记录,程序异常捕获等. 1. ...

  7. 利用过滤器Filter和特性Attribute实现对Web API返回结果的封装和统一异常处理

    在我们开发Web API应用的时候,我们可以借鉴ABP框架的过滤器Filter和特性Attribute的应用,实现对Web API返回结果的封装和统一异常处理,本篇随笔介绍利用AuthorizeAtt ...

  8. ASP.NET Web API 2 之参数验证

    Ø  前言 目前 C# 比较流行使用 ASP.NET Web API 来承载 Web 接口,提供与客户端之间的数据交互,现在的版本已经是 2.0 了.既然是接口就少不了对输入参数的验证,所以本文主要探 ...

  9. Web APi之过滤器执行过程原理解析【二】(十一)

    前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授 ...

随机推荐

  1. hdu 1978 How many ways(记忆化搜索)

    这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下:1.机器人一开始在棋盘的起始点并有起始点所标有的能量.2.机器人只能向右或者向下走,并 ...

  2. ACM-ICPC 2015 BeiJing

    比赛连接:ACM-ICPC 2015 BeiJing 本次比赛只写了 A G     然后 I题随后补 A 有一个正方形土地,上面有若干块绿洲.让你以x0为界限划一条竖线,要求左边绿洲面积>=右 ...

  3. bzoj2457 双端队列

    虽然分类在数据结构里,但是实际上是个贪心题...... 我自己一开始想到了一个错误的贪心.后来发现对于相等值的处理不行. 有个很神的转化,就是把排好序的队列以及对应的原下标都给搞出来. 然后考虑其中一 ...

  4. 苹果电脑python3安装pillow模块

    我刚开始在苹果电脑自带的python 中安装了pillow模块,导致在后期我想在python3中安装pilow模块的时候 pip3 install pillow 但是总会提示错误说电脑中已经存在pil ...

  5. POJ 1815 Friendship (Dinic)

    Friendship Time Limit: 2000MS   Memory Limit: 20000K Total Submissions: 11429   Accepted: 3173 Descr ...

  6. springboot 新模板 呵呵了

    <html> <head> <title>批处理任务管理</title> <meta name="decorator" con ...

  7. (线性dp,最大连续和)Max Sequence

    Max Sequence Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18511   Accepted: 7743 Des ...

  8. 原生js操作Dom命令总结

    常用的dom方法 document.getElementById(“box”);//通过id获取标签    document.getElementsByTagName(“div”);根据标签名获取页面 ...

  9. C++中string、char *、char[]的转换

    头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会.现在从网上找了点资料,看了看,知道点东西了. 一.string转char*. 主要有三种方法可以将str转换为char*类型,分别是:da ...

  10. MySQL最优配置模板( 5.6&5.7)(运维那点事)

    MySQL 5.6&5.7配置文件(姜总提供) [mysql] default-character-set=utf8mb4 user = root password = 123456 port ...