2017-04-07 29 views
0

我有一個簡單的Web API 2控制器來處理文件上傳。它看起來像這樣:在正文上傳之前驗證Web API會話

[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); 
    } 
} 

它需要一個流上傳從客戶端,動手吧開了一個資源庫對象(其中談到到Azure存儲的Blob容器),然後返回有關上傳文件的一些數據。夠簡單,而且效果很好。

除非在客戶端上傳文件之前不應用認證過濾器。身份驗證是一個簡單的使用令牌的質詢/響應系統,因此這意味着客戶可以輕鬆上傳數百兆字節的數據(可能通過慢速蜂窩數據連接),然後發現其令牌已過期,並且需要刷新它並嘗試再次。我希望能夠儘早檢查請求標題並驗證(或拒絕)它,但這似乎不適用於標準過濾器。我也嘗試創建一個簡單的IHttpModule並掛接到BeginRequest事件中,但顯然直到上傳完成後纔會觸發。

如何在管道中掛鉤,以便在客戶端上載完成之前驗證請求的授權標頭?

編輯補充: 顯然早身份驗證沒有做任何我好,如果我也不能授權,基於網絡API的路線上。我的服務有一些匿名方法,所以我不能只覆蓋拒絕未經身份驗證的用戶。鑑於IIS和ASP.net的架構,也許這意味着這是不可能的。

回答

0

您很可能需要將此請求變成2階段請求。文件上傳請求之前的一個身份驗證請求。這是一個很大的包袱,終點無法處理請求,直到它完成接收。在上傳文件之前嘗試單獨的授權請求。如果您的請求通過,那麼您可以發送文件上傳。這是一個好的解決方案嗎?

+0

這實際上是我現在正在做的。部分問題是,如果實施,這種上傳就成爲潛在的DoS向量;未經身份驗證的用戶可以上傳大量的數據,IIS會在檢查最終用戶是否發送任何憑證之前,盡職盡責地將其轉入磁盤。 – superstator

+0

您可以在單獨的線程上使用backgroundworker實現一個看門狗,以處理這種請求。檢測請求並運行看門狗。如果請求超過一定的時間,大小,嘗試次數,重複的ip嘗試次數,某個時間段內上傳的次數太多等等,則可以強制該請求結束。我確信有辦法繞過它。 – trevster344