获取“上传时间”

时间:2014-07-20 11:08:57

标签: asp.net-web-api

我正在开发一个WebAPI服务,您可以在其中上传文件。 Action看起来像这样:

[HttpPost]
public async Task<IHttpActionResult> PostAsync(byte[] content)
{
   var now = DateTime.UtcNow;
}

使用WebAPI的客户端还提供时间戳作为标头,与一些HMAC-stuff一起使用以进行身份​​验证。身份验证的一部分是验证时间戳。我们解析时间戳并检查它是否距离now +/- 5分钟。如果没有,那么auth失败。 除了这个上传API(在某些情况下)之外,它适用于我们所有的API调用。问题是,有时用户通过慢速连接上传大文件,因此上传文件需要5分钟以上,我们检查的时间点是整个文件上传后的。

因此:

  1. 在整个文件上传之前,我们可以以某种方式进行HMAC检查吗? (HMAC检查中不使用文件本身(HTTP内容))。今天我们使用ActionFilter
  2. 我可以在我的Action代码中获得“请求时间”(第一个字节到达或其他什么)吗?
  3. 谢谢!

1 个答案:

答案 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();
        }
    }
 }

我希望在同样的情况下帮助其他人......