我正在开发一个WebAPI服务,您可以在其中上传文件。 Action看起来像这样:
[HttpPost]
public async Task<IHttpActionResult> PostAsync(byte[] content)
{
var now = DateTime.UtcNow;
}
使用WebAPI的客户端还提供时间戳作为标头,与一些HMAC-stuff一起使用以进行身份验证。身份验证的一部分是验证时间戳。我们解析时间戳并检查它是否距离now
+/- 5分钟。如果没有,那么auth失败。
除了这个上传API(在某些情况下)之外,它适用于我们所有的API调用。问题是,有时用户通过慢速连接上传大文件,因此上传文件需要5分钟以上,我们检查的时间点是整个文件上传后的。
因此:
ActionFilter
。谢谢!
答案 0 :(得分:0)
所以,经过一番调查后,我想出了一个更好的解决方案: 使用HTTP模块进行实际的HMAC身份验证。
阅读此博客文章(http://blogs.msdn.com/b/tmarq/archive/2007/08/30/iis-7-0-asp-net-pipelines-modules-handlers-and-preconditions.aspx)后,我对IIS的运作方式有了更深入的了解。
我决定使用在MVC Action之前调用的HTTP模块。
代码最终如下:
public class HmacModule : IHttpModule
{
public void Init(HttpApplication context)
{
EventHandlerTaskAsyncHelper taskAsyncHelper = new EventHandlerTaskAsyncHelper(Authenticate);
context.AddOnBeginRequestAsync(taskAsyncHelper.BeginEventHandler, taskAsyncHelper.EndEventHandler);
}
private async Task Authenticate(object sender, EventArgs e)
{
var context = ((HttpApplication)sender).Context;
var request = context.Request;
var authResponse = await CheckAuthentication(request);
if (!authResponse.HasAccess)
{
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
context.Response.StatusDescription = authResponse.ErrorMessage;
if (authResponse.Details != null)
context.Response.Write(authResponse.Details);
context.Response.End();
}
}
}
我希望在同样的情况下帮助其他人......