2014-02-19 102 views
1

我有一個REST Web API,它接收一些apiKey。此Web API的GET動作的一個例子是:將授權標頭中的api密鑰發送到REST Web API

public HttpResponseMessage Get(int id, string apiKey) 

是在我的Web API定義的唯一途徑是:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

現在,有一個使用此Web API上的Web客戶端並在執行GET請求時在查詢字符串中發送apiKey

據我所知,最好在請求的授權標頭中發送apiKey

有人能告訴我我該怎麼做GET請求,並把那個apiKey在Authorization頭,並在corect操作方法(我的意思是這裏的Get上述方法)仍然降落?

回答

4

您可以欺騙Web API,使其認爲Authorization標頭是來自帶有小消息處理程序的查詢字符串的參數。

public class ApiKeyHandler : DelegatingHandler 
    { 
     protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      var routeData = request.GetRouteData(); 

      if (request.Headers.Authorization != null && !routeData.Values.ContainsKey("apikey")) 
      { 
       routeData.Values.Add("apikey",request.Headers.Authorization.Parameter); 
      } 
      return base.SendAsync(request, cancellationToken); 
     } 
    } 

此處理程序將抓住已經從URI中提取的路徑數據,並且如果你傳遞一個授權頭,將採取的參數值,並將其設置爲一個apikey路線參數。

授權頭需要通過添加此鏈接到您的WebApiConfig.Register方法看起來像

Authorization: apikey 12323434234234234 

您可以安裝消息處理程序。

config.MessageHandlers.Add(new ApiKeyHandler()); 

另外,您可以使用像這樣的處理程序來實際驗證ApiKey。這樣你實際上不需要將api鍵傳遞給你的動作方法。如果ApiKey不好,直接從您的處理程序直接返回401。

+0

你好,我明白你的意思。 我也明白,不需要將apikey作爲每個操作方法的參數。 但是,如果我發佈了一個post請求,apiKey是表單中的一個隱藏字段,它不會在Headers集合中出現。 – user1980412