在正文上传之前验证Web API会话

时间:2017-04-07 21:25:12

标签: iis file-upload asp.net-web-api2

我有一个简单的Web API 2控制器来处理文件上传。它看起来像这样:

exprs = xpath.compile("/Employees/Employee/@id" + id+ "']/name/text()");

从客户端进行流式上传,将其交给存储库对象(与Azure存储Blob容器对话),然后返回有关上传文件的一些数据。很简单,效果很好。

除非在客户端完成上传文件之后才应用身份验证过滤器。身份验证是使用令牌的简单挑战/响应系统,因此这意味着客户端可以轻松上传数百兆字节的数据(可能通过缓慢的蜂窝数据连接),然后才能发现他们的令牌已过期并且需要刷新它并尝试再次。我希望能够尽早检查请求标头并验证(或拒绝)它,但这似乎不适用于标准过滤器。我还尝试创建一个简单的[MyCustomAuthenticationFilter] [Authorize] public class FileController : ApiController { private IFileRepository _FileRepository; public FileController(IFileRepository fileRepository) { _FileRepository = fileRepository; } public async Task<FileInfo> Post() { var stream = await Request.Content.ReadAsStreamAsync(); var info = await _FileRepository.CreateFileAsync(stream); return new FileInfo(info); } } 并挂钩IHttpModule事件,但这显然不会在上传完成之后触发。

如何挂钩管道,以便在客户端上传完成之前验证请求的授权标头?

编辑以添加: 显然,如果我不能根据Web API中的路由进行授权,那么早期验证对我没有任何好处。我的服务有一些匿名方法,因此我无法拒绝未经身份验证的用户。鉴于IIS和ASP.net的架构,也许这意味着这是不可能的。

1 个答案:

答案 0 :(得分:0)

您很可能需要将此请求转换为2阶段请求。文件上载请求之前的一个身份验证请求。这是很多行李,终点无法处理请求,直到完成接收为止。在上传文件之前尝试单独的授权请求。如果您的请求通过,那么您可以发送文件上传。这是一个好的解决方案吗?