博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用DelegatingHandler实现Web Api 的Api key校验
阅读量:6413 次
发布时间:2019-06-23

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

原文:

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

  • 基于Querystring提供Api key

  • 基于Request header体统API key

client.BaseAddress = new Uri(url);client.DefaultRequestHeaders.Accept.Clear();client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));client.DefaultRequestHeaders.Add("X-ApiKey","00000");

编写ApiKeyHandler

public class ApiKeyHandler : DelegatingHandler    {        public string Key { get; set; }        public ApiKeyHandler(string key,HttpConfiguration httpConfiguration)        {            this.Key = key;            InnerHandler = new HttpControllerDispatcher(httpConfiguration);         }        protected override Task
SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { if (!ValidateKey(request)) { var response = new HttpResponseMessage(HttpStatusCode.Forbidden); var tsc = new TaskCompletionSource
(); tsc.SetResult(response); return tsc.Task; } return base.SendAsync(request, cancellationToken); } private bool ValidateKey(HttpRequestMessage message) { IEnumerable
apiKeyHeaderValues = null; if (message.Headers.TryGetValues("X-ApiKey", out apiKeyHeaderValues)) { var apiKeyHeaderValue = apiKeyHeaderValues.First(); return (apiKeyHeaderValue == this.Key) // ... your authentication logic here ... /* var username = (apiKeyHeaderValue == "00000" ? "Maarten" : "OtherUser"); var usernameClaim = new Claim(ClaimTypes.Name, username); var identity = new ClaimsIdentity(new[] { usernameClaim }, "ApiKey"); var principal = new ClaimsPrincipal(identity); Thread.CurrentPrincipal = principal; */ } /* var query = message.RequestUri.ParseQueryString(); string key = query["key"]; return (key == this.Key); */ }

配置到特定的路由上去

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

 

转载于:https://www.cnblogs.com/licin/p/6845574.html

你可能感兴趣的文章
基于消息队列的双向通信
查看>>
一个不错的loading效果
查看>>
高中学渣逆袭入“大学”:如今月收入达五位数
查看>>
Debian允许root用户登录
查看>>
C++ - this指针
查看>>
Google Test and Google Mock Introduction
查看>>
Spring整合Struts2
查看>>
exwc,system,passthru,shell_wxwc讲解
查看>>
BPM表单设计器公式设计参考
查看>>
近万字长文,设计分布式系统需要考虑因素的都在这里!
查看>>
linux的文件系统
查看>>
MySQL测试
查看>>
分析的套路
查看>>
使用pure-ftpd搭建ftp服务
查看>>
mysql 中的varchar(255) uft-8 的格式到底能放多少汉字?
查看>>
python 实现儿童算术游戏
查看>>
IPSEC ×××的复习
查看>>
Delphi TColor和16进制颜色的相互转换
查看>>
mysql 的安装(二进制安装)
查看>>
上云利器,K8S应用编排设计器之快到极致
查看>>