我正在使用基于本文的身份验证来实现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}
让我重复这样的代码(干!)看起来非常错误。还有更好的方法吗?
答案 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);
}
}
}