2011-07-20 64 views
3

我根據這篇文章的實施使用認證的API:C#MVC實現API參數

http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

而這種相關答案由同一作者Implementing a 2 Legged OAuth Provider

我有一個工作概念在API中是這樣的,其中籤名參數是使用客戶端私鑰生成的關鍵參數的SHA256 HMAC:

[HttpGet] [ActionName("List")] 
public ActionResult ListGet(string key, string signature) 
{ 
    string serverSignature = GetSignature(key); 
    if (serverSignature != signature) 
    { 
    throw new ArgumentException("Invalid signature", signature); 
    } 
    // get and return the list 
} 

HMAC部分完美工作,我能夠在客戶端上生成簽名並將其與服務器上的預期簽名進行比較。

但是這個新參數signature需要應用於每一個API調用。有沒有什麼辦法在MVC 2以通用的方式做到這一點,而不必手動添加簽名參數和檢查簽名代碼到每一個單一的行動方法?

即反正是有,以避免在每一個控制器的每一個行動,這樣寫:(!DRY)

public ActionResult List(string key, string signature) { GetSignature(key); // etc } 
public ActionResult Add(string key, string signature) { GetSignature(key); // etc } 
public ActionResult Update(string key, int id, string signature) { GetSignature(key, id); // etc} 
public ActionResult Delete(string key, int id, string signature) { GetSignature(key, id); // etc} 
public ActionResult Action1(string key, string x, string signature) { GetSignature(key, x);//etc} 

它看起來非常錯誤的我有相同的代碼重複這樣的。有沒有更好的辦法?

+0

那麼我的答案是否有所幫助? – Shannow

回答

2

您可以創建一個自定義屬性來存儲並檢查它;

[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] 
    public class Securitycheck : ActionFilterAttribute { 
     public Securitycheck (String key, String sig) { 
     } 
     public override void OnActionExecuting(ActionExecutingContext filterContext) { 
      base.OnActionExecuting(filterContext); 
      if (failed) { 
       filterContext.Result = new RedirectResult(redirect); 
      } 
     } 
    }