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

3

我正在实现一个基于身份验证的API,参考了这篇文章:

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

同一位作者的相关回答实现一个双腿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原则)。有更好的方法吗?


我的回答有帮到你吗? - Shannow
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接