c# MVC实现带有HMAC签名参数的API

本文关键字:参数 API HMAC MVC 实现 | 更新日期: 2023-09-27 18:03:06

我正在基于本文实现一个使用身份验证的API:

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

这个相关的答案来自同一个作者实现一个2腿的OAuth提供者

我在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} 

对我来说,像那样重复同一段代码看起来非常错误(DRY!)。有没有更好的办法?

c# MVC实现带有HMAC签名参数的API

您可以创建一个自定义属性来存储它并检查它;

    [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);
            }
        }
    }