使用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: }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

网页优化系列二:使用Cache缓存静态文件、图片(asp.net版)

  网站中存在一些不会经常变更的内容如静态文件、图片等,我们称之为静态资源。针对这些静态资源使用cache缓存到客户端中,以减少用户再次浏览该网页时的请求量,从...

2497
来自专栏hbbliyong

WCF浅尝

1.首先先建立一个WCF服务应用程序 ? 2.再建立一个宿主程序,这里用控制台,添加服务引用,这里会报错: ? 点击页面确定,回到添加服务页面 ? 点击箭头有如...

35910
来自专栏老付的网络博客

js如何操作本地程序

假设有这样一个产品,一个web和一个winform客户端,在客户在web的网页上面点击启动客户端来处理,这个时候开始调用本地的客户端,来完成指定的工作。这种场景...

1862
来自专栏跟着阿笨一起玩NET

Asp.net中把DataTable或DataGrid导出为Excel

当前编码的一个项目中有把查询结果(显示在DataGrid)导出为excel的需求,尝试了几种方法,作为技巧拿来和大家分享。 内容: 服务器端实现Data...

1831
来自专栏技术博客

WCF HttpContext.Current为空的问题

原来在项目中使用HttpContext.Current没什么问题,但是到了中期阶段,项目重构等,并且要求使用WCF,所以就出现了HttpContext.Curr...

1042
来自专栏.NET开发那点事

AServer - 基于Asp.net core Kestrel的超迷你http服务器

  AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器。它可以集成进你的Core程序里,用来快速的响应Http请求,而不...

1186
来自专栏bluesummer

用Token令牌维护微服务之间的通信安全的实现

在微服务架构中,如果忽略服务的安全性,任由接口暴露在网络中,一旦遭受攻击后果是不可想象的、 保护微服务键安全的常见方案有:1.JWT令牌(token) 2.双向...

3747
来自专栏晓晨的专栏

IdentityServer4(10)- 添加对外部认证的支持之QQ登录

3033
来自专栏技术小讲堂

ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预

什么是ASP.NET Profile 可以为每个用户(包括匿名用户)储存信息 通过在Web.config中的配置即可在应用程序中使用 强类型的属性 可以定义属性...

4459
来自专栏技术博客

Entity Framework ModelFirst尝试

Model First我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计...

1312

扫码关注云+社区

领取腾讯云代金券