我們最近通過使用存儲在Azure文檔數據庫中的憑據實現自定義AuthorizationFilterAttribute來實現API身份驗證。 DocDB要求一切都使用異步。WebApi2何時使用OnAuthorizationAsync vs OnAuthorization
通過實驗我們發現WebApi2同步控制器將使用OnAuthorizationAsync(如果存在)以及OnAuthorization(如果沒有異步方法)。我們還發現asyc控制器方法可以使用auth方法。但我不是100%確定它工作正常。我們只看到代碼確實觸及了斷點。
奇怪的是,你還可以覆蓋OnAuthorization將其標記爲異步
public async override Task OnAuthorization(....)
這最後一種方法編譯和執行罰款,但控制器將不會等待身份驗證過濾器執行完操作方法開始之前。通常的結果是一個ASP錯誤:
An asynchronous module or handler completed while an asynchronous operation was still pending
好像這個操縱覆蓋的應該是一個編譯錯誤,並不允許的。
無論如何......關於AuthorizationFilterAttribute還有很多謎團,還有一些關於混淆的帖子。 Custom Authorization in Asp.net WebApi - what a mess?
我的問題是你如何知道哪個執行順序和哪個優先順序?它確實出現,如果兩者都存在於過濾器中,則只執行一個方法。
如果您的控制器操作是異步的,您是否必須重寫OnAuthorizationAsync方法?
如果你的auth邏輯中有async等待,並且被迫使用OnAuthorizationAsync(像我一樣),那麼這是否意味着我必須將所有控制器動作改爲現在都是異步控制器動作?
我找不到任何說明異步操作過濾器場景的文檔。
如果在兩者中都放置斷點,您會發現首先調用OnAuthorizationAsync;如果您在OnAuthorization被調用時檢查調用堆棧,則會在執行base.OnAuthorizationAsync()期間看到它被調用。 – mjohnsonengr 2016-03-27 03:52:40