C#MVC使用HMAC签名参数实现API

时间:2011-07-20 10:26:02

标签: c# asp.net-mvc parameters action dry

我正在使用基于本文的身份验证来实现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中是否有任何方式以通用方式执行此操作,而不必手动将签名参数和检查签名代码添加到每个操作方法中?

无论如何,无论如何都要避免在每个控制器的每个动作中都写这个:

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} 

让我重复这样的代码(干!)看起来非常错误。还有更好的方法吗?

1 个答案:

答案 0 :(得分: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);
            }
        }
    }