客户端在请求Web Api时可以有以下两种方式提供API key

  • 基于Querystring提供Api key

http://localhost:57967/Api/Values?key=12345

  • 基于Request header体统API key
  1. client.BaseAddress = new Uri(url);
  2. client.DefaultRequestHeaders.Accept.Clear();
  3. client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  4. client.DefaultRequestHeaders.Add("X-ApiKey","00000");

编写ApiKeyHandler

  1. public class ApiKeyHandler : DelegatingHandler
  2. {
  3. public string Key { get; set; }
  4. public ApiKeyHandler(string key,HttpConfiguration httpConfiguration)
  5. {
  6. this.Key = key;
  7. InnerHandler = new HttpControllerDispatcher(httpConfiguration);
  8. }
  9. protected override Task<HttpResponseMessage> SendAsync(
  10. HttpRequestMessage request, CancellationToken cancellationToken)
  11. {
  12. if (!ValidateKey(request))
  13. {
  14. var response = new HttpResponseMessage(HttpStatusCode.Forbidden);
  15. var tsc = new TaskCompletionSource<HttpResponseMessage>();
  16. tsc.SetResult(response);
  17. return tsc.Task;
  18. }
  19. return base.SendAsync(request, cancellationToken);
  20. }
  21. private bool ValidateKey(HttpRequestMessage message)
  22. {
  23. IEnumerable<string> apiKeyHeaderValues = null;
  24. if (message.Headers.TryGetValues("X-ApiKey", out apiKeyHeaderValues))
  25. {
  26. var apiKeyHeaderValue = apiKeyHeaderValues.First();
  27. return (apiKeyHeaderValue == this.Key)
  28. // ... your authentication logic here ...
  29. /*
  30. var username = (apiKeyHeaderValue == "00000" ? "Maarten" : "OtherUser");
  31. var usernameClaim = new Claim(ClaimTypes.Name, username);
  32. var identity = new ClaimsIdentity(new[] { usernameClaim }, "ApiKey");
  33. var principal = new ClaimsPrincipal(identity);
  34. Thread.CurrentPrincipal = principal;
  35. */
  36. }
  37. /*
  38. var query = message.RequestUri.ParseQueryString();
  39. string key = query["key"];
  40. return (key == this.Key);
  41. */
  42. }

配置到特定的路由上去

  1. config.Routes.MapHttpRoute(
  2. name: "DefaultApi",
  3. routeTemplate: "api/{controller}/{id}",
  4. defaults: new { id = RouteParameter.Optional },
  5. constraints: null,
  6. handler: new ApiKeyHandler("12345", GlobalConfiguration.Configuration)
  7. );

利用DelegatingHandler实现Web Api 的Api key校验的更多相关文章

  1. 利用百度地图WEB服务APIGeoCoding API批量地址解析

    Geocoding API包括地址解析和逆地址解析功能: 地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度信息,例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.3 ...

  2. 利用Swashbuckle生成Web API Help Pages

    利用Swashbuckle生成Web API Help Pages 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: ...

  3. 利用Swashbuckle生成Web API Help Pages

    利用Swashbuckle生成Web API Help Pages 本文将通过Swagger的.NET Core的实现封装工具Swashbuckle来生成上一篇-<创建ASP.NET Core ...

  4. 实现Web请求后端Api的Demo,实现是通过JQuery的AJAX实现后端请求,以及对请求到的数据的解析处理,实现登录功能

    本篇实现Web请求后端Api的Demo,实现是通过JQuery的AJAX实现后端请求,以及对请求到的数据的解析处理,实现登录功能需求描述:1. 请求后端Api接口地址2. 根据返回信息进行判断处理前端 ...

  5. asp.net web api 构建api帮助文档

    1 概要 创建ASP.NET Web Api 时模板自带Help Pages框架. 2 问题 1)使用VS创建Web Api项目时,模板将Help Pages框架自动集成到其中,使得Web Api项目 ...

  6. 利用Vert.x构建简单的API 服务、分布式服务

    目前已经使用Vertx已经一年多了,虽然没有太多的造诣,但也已在项目中推广了下:从最初的vertx搭建web服务,到项目上线运营,还算比较稳定.再到后来尝试搭建基于vertx的分布式服务,一路下来也积 ...

  7. ASP.NET Web Pages (Razor) API Quick Reference

    ASP.NET Web Pages (Razor) API Quick Reference By Tom FitzMacken|February 10, 2014 Print This page co ...

  8. 重构Web Api程序(Api Controller和Entity)续篇

    昨天有写总结<重构Web Api程序(Api Controller和Entity)>http://www.cnblogs.com/insus/p/4350111.html,把一些数据交换的 ...

  9. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

随机推荐

  1. C和指针 第十六章 标准函数库 本地跳转setjmp.h

    setjmp和longjmp提供一种类似goto语句的机制,但它的作用域不局限于同一个函数的作用域之内.这些函数可以用于深层次的嵌套函数调用链. int setjmp(jmp_buf state); ...

  2. SLF4J: Class path contains multiple SLF4J bindings.

    库冲突导致的异常,由于多次引入SLF4j包导致. It seems you have several implementation of SLF4J; you should exclude all t ...

  3. RabbitMQ 集群安装过程详解

    一.安装Erlang 1.rabbitMQ是基于erlang的,所以首先必须配置erlang环境. 从erlang官网下载 otp 18.3.下载链接:http://erlang.org/downlo ...

  4. 推荐一些国内的Jquery CDN免费服务

    Jquery是个非常流行的JS前端框架,在很多网站都能看到它的身影.很多网站都喜欢采用一些Jquery CDN加速服务,这样网站加载jquery会更快.之前火端网络的一些网站都是使用Google的jq ...

  5. 项目vue2.0仿外卖APP(六)

    goods 商品列表页开发 布局编写 除了商品之外还有购物车,还有个详情页,挺复杂的. 两栏布局:左侧固定宽度,右侧自适应,还是用flex. 因为内容可能会超过手机高度,超过就隐藏.左右两侧的内容是可 ...

  6. connect-flash 中间件

    http://blog.csdn.net/liangklfang/article/details/51086607

  7. Ubuntu 安装php+mysql 环境

    新系统安装完毕后,首先运行apt-get update 更新apt库. 然后安装ssh,输入apt-get install openssh-server,安装ssh是为了可以远程操作,不然坐在机房实在 ...

  8. 【日记】搭建一个node本地服务器

    用node搭建一个本地http服务器.首先了解htpp服务器原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型 ...

  9. jquery中on绑定事件

    之前项目中动态创建的标签元素  在绑定事件的时候  都是无效  无论如何都不能触发 eg:在页面加载完成之后   再由脚本动态创建的<div>元素  在绑定事件的时候 例如click事件 ...

  10. Centos7下安装mysql5.7.16

    mysql的安装(root用户下) 从官网下载软件 linux下必须安装系统对应的版本,多少位 必须安装的是:server,client 但是我可不管要安装那个插件,我们直接使用bundle版本(就是 ...