使用API Key验证WCF Data Service
时间:2022-04-23
本文章向大家介绍使用API Key验证WCF Data Service,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Ron Jacobs 有篇文章介绍如何在WCF Rest Service中使用API Key验证:http://blogs.msdn.com/b/rjacobs/archive/2010/06/14/how-to-do-api-key-verification-for-rest-services-in-net-4.aspx ,在WCF Data Service中怎么做呢?本文将介绍如何在WCF Data Service中使用API Key进行验证,主要代码来自于Ron Jacobs的这篇文章.
API Key作为一个参数在URL中传递, 在Rob Jacobs的WCFWebHttpLibrary.APIKeyAuthorization的方法string GetAPIKey(OperationContext operationContext)的代码如下:
1: public string GetAPIKey(OperationContext operationContext)
2: {
3: // Get the request message
4: var request = operationContext.RequestContext.RequestMessage;
5: // Get the HTTP Request
6: var requestProp =(HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
7: // Get the query string
8: NameValueCollection queryParams =
9: HttpUtility.ParseQueryString(requestProp.QueryString);
10:
11: // Return the API key (if present, null if not)
12: string apiKey = queryParams[APIKEY];
13: // Is the API Key available in the querystring?
14: if (apiKey == null)
15: {
16: // Is the API Key available in the header?
17: apiKey = requestProp.Headers[APIKEY];
18: }
19: return apiKey;
20: }
WCF Data Service的OnStartProcessingRequest 方法在处理每个请求之前调用。对于批处理请求,将会为顶级批处理请求调用一次,然后为批处理中的每个操作调用一次。 我们在这个方法里可以实施自定义验证的相关逻辑:
1: protected override void OnStartProcessingRequest(ProcessRequestArgs args)
2: {
3: var queryParams = HttpUtility.ParseQueryString(args.OperationContext.AbsoluteRequestUri.Query);
4: string apiKey = queryParams[APIKEY];
5: if (apiKey == null)
6: {
7: apiKey = args.OperationContext.RequestHeaders[APIKEY];
8: }
9: if (CheckValidAPIKey(apiKey))
10: {
11: base.OnStartProcessingRequest(args);
12: }
13: else
14: {
15: throw new System.Web.Services.Protocols.SoapException();
16: }
17:
18: }
19:
客户端调用的时候,可以在SendingRequest事件添加到请求的Header里头:
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: Uri serviceUri = new Uri("http://localhost/ProfilesDataService");
6:
7: ServiceReference.YUPEntities service = new ServiceReference.YUPEntities(serviceUri);
8: service.SendingRequest += new EventHandler<System.Data.Services.Client.SendingRequestEventArgs>
9:
10: (service_SendingRequest);
11:
12: var items = service.Execute<UserProfile>(new Uri(http://localhost/ProfilesDataService/GetUserProfile?username='testvip')).ToList();
13: foreach (UserProfile profile in items)
14: {
15: Console.WriteLine(profile.Title);
16: }
17: }
18:
19: static void service_SendingRequest(object sender,System.Data.Services.Client.SendingRequestEventArgs e)
20: {
21: // when using api in the header...
22: e.Request.Headers.Add("APIkey", "918704ec-4811-45b6-a169-16bae3df69a8");
23:
24: }
25:
26: }
- 使用子查询时应当注意的
- LegacyText的复制的Bug
- 提高WCF服务并发能力的简单处理办法
- 如何给已经有数据的DataTable动态增加一列并赋值
- Gitlab上采用rpm方式快速安装的操作记录
- WCF与IIS集成Windows身份验证的矛盾
- openstack中彻底删除计算节点的操作记录
- 验证码无刷新更换
- 从MapX到MapXtreme2004[12]-SearchNearest!
- Sublime Text的安装与配置
- 复制到浮动层,强调显示某个(多个)区域
- Jquery实现的一种常用高亮效果
- MaCfee导致Asp.net/Jmail无法发送邮件的解决办法
- 水晶报表文本在web中无法两端对齐
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 构建没有数据集的辣辣椒分类器,准确性达到96%
- 由 Redis 分布式锁造成的重大事故
- 10分钟搞定 Java 并发队列好吗?好的
- MySQL 案例:关于程序端的连接池与数据库的连接数
- spark和kafka jar包冲突NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream
- 聊聊claudb的scripting command
- PHP怎么获取视频总时长的函数方法
- 构建Docker私有仓库
- Dockerfile使用
- Nginx+KeepAlived实现高可用
- Docker使用
- 高性能反向代理器Nginx
- Docker初识
- Rabbit-使用
- Netty之WebSocket协议应用开发