2014-05-15 54 views
1

我想搜索這個問題,但沒有太多的運氣。單個客戶端(消費者)的webapi安全

這個想法是設計一個web api,最初只會被內部web前端(例如asp.net MVC應用程序)佔用。原因是我沒有太多時間花費在現在使Webapi安全(可能將來應用程序將暴露給www)。

我試過DotNetOpenAuth但它沒有很好的文檔。

所以問題是如何保護Web API沒有太多複雜的安全代碼,以便它可以安全地與我的ASP.NET MVC應用程序通信?

或者這是一個完全錯誤的方法。也許我應該在一開始就確保我的webapi?

無論如何,有誰知道如何實現這一目標?任何文章或評論?

感謝

+0

什麼是您使用該服務的計劃?您的API是否允許來自該網站的Ajax電話?或者你的網站只是內部的? –

回答

2

我想創建一個簡單的DelegatingHandler,將每個請求之前被稱爲

public class AuthorizationDelegatingHandler : DelegatingHandler 
{ 
    private const string API_KEY = "8139E7541722F5D91ED8FB15165F4" 

    protected override async Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    { 
     if (request.Headers.Authorization == null) 
      return request.CreateResponse(HttpStatusCode.Unauthorized); 

     if (request.Headers.Authorization.Scheme != "Basic") 
      return request.CreateResponse(HttpStatusCode.Unauthorized); 

     var authToken = request.Headers.Authorization.Parameter; 

     var apiKey = Encoding.UTF8.GetString(Convert.FromBase64String(authToken)) 
      .Split(':') 
      .FirstOrDefault(x => !string.IsNullOrWhiteSpace(x)); 

     if (string.IsNullOrWhiteSpace(apiKey) || apiKey != API_KEY) 
      return request.CreateResponse(HttpStatusCode.Unauthorized); 

     return await base.SendAsync(request, cancellationToken); 
    } 
} 

我知道使用的是靜態令牌也許不是最好的東西,但它應該給你一個想法。

在你的bootstrap,則需要

GlobalFilters.Filters.Add(new AuthorizationDelegatingHandler()); 

然後註冊此處理時,你會調用這個API,你可以添加使用Basic方案Authorization頭。

每個沒有這個頭的請求都會返回一個未經授權的響應。

客戶端應該調用API是這樣的:

var client = new HttpClient 
{ 
    BaseAddress = new Uri(API_URL) 
}; 

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Basic", 
    Convert.ToBase64String(Encoding.UTF8.GetBytes("8139E7541722F5D91ED8FB15165F4:")));