我有一个简单的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的架构,也许这意味着这是不可能的。
答案 0 :(得分:0)
您很可能需要将此请求转换为2阶段请求。文件上载请求之前的一个身份验证请求。这是很多行李,终点无法处理请求,直到完成接收为止。在上传文件之前尝试单独的授权请求。如果您的请求通过,那么您可以发送文件上传。这是一个好的解决方案吗?