我從VS2013 SPA模板(web api 2.2)中獲得了一個網站,它利用了ASP.NET Identity 2.1,並且一切運行良好。我的控制器方法是這樣的:Azure中的ASP.NET Web API:自定義身份驗證篩選器以防止暴力破解?
[Authorize]
public Api.Models.Widget Get(int widgetId)
{
var requestingUserId = Int32.Parse(Microsoft.AspNet.Identity.IdentityExtensions.GetUserId(User.Identity));
...
}
它按預期工作:
- 未經授權的用戶無權訪問
- 授權的用戶獲取後,我能得到他們的用戶ID
但是我現在想修改應用程序來防止過多的API請求。我打算檢查一下特定的用戶ID是否在特定的時間段內發出了一定數量的請求。我正在尋找最佳地點的建議。
我不想在每個控制器中重複這個邏輯,而且它看起來像一個動作過濾器可能是最好的地方。但是,因爲這需要閱讀用戶標識,而且我不確定過濾器的順序是否得到保證,所以如果可能的話,也可以派生出已被調用授權並添加額外邏輯的過濾器。
我想知道是否有人可以舉一個類似的做法的例子嗎?它似乎不是「授權」,而是在自定義認證過濾器中,我不知道如何將它們結合在一起。
感謝您的任何建議...
「這個存儲應該儘可能輕,因此使用NoSQL db可能是一個好方法。」是的,很好的電話。由於這是在Azure中,我計劃爲此使用Azure表存儲。感謝您的有益迴應! – BenjiFB 2014-10-11 12:38:11
@BenjiFB不客氣! – 2014-10-11 14:22:07
@BenjiFB我同意,這種細粒度的會話狀態跟蹤不是SQL Server的工作,但我不確定Azure Table存儲是否是。我的直覺是,在這種情況下,Azure Redis緩存的性能會提高一個數量級。我覺得這個節流措施正在變成一個迷你項目,只是爲了一個需要的感覺。請記住,真正的惡意用戶可能會讓系統癱瘓,並導致它掛在進程會話頻率檢查之外,特別是如果不使用異步等待編碼實踐。 – camelCase 2014-12-18 01:09:27