2011-07-20 71 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); 
      } 
     } 
    }