1. 程式人生 > >Abp(.NetCore)開發與發布過程2

Abp(.NetCore)開發與發布過程2

for 默認 而是 type list csr 背景 size 請求

在Abp(.NetCore)開發過程中遇到很多問題,今天記錄下Abp的防CSRF功能(AntiForgeryToken ),


背景知識。

AntiForgeryToken 可以說是處理/預防CSRF的一種處理方案。

那麽什麽是CSRF?

CSRF(Cross-site request forgery)是跨站請求偽造,也被稱為One Click Attack或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。

簡單理解的話就是:有人盜用了你的身份,並且用你的名義發送惡意請求

最近幾年,CSRF處於不溫不火的地位,但是還是要對這個小心防範!


  ABP默認開啟了防CSRF的功能,具體參見 Startup 類,

技術分享

但後來發現,[email protected]() 也可以請求成功,例如

  1.$.ajax 在 使用 jQuery.ajax 時不用設置 @Html.AntiForgeryToken()

  註意 在請求Controller的POST方法時,需要使 contentType = ‘application/x-www-form-urlencoded‘,這應該是.NetCore的奇怪特性。如果contentType = ‘application/json’,那麽在Controller的方法中應該設置[FormBody]

  如果不這麽做,後臺是接收不到值的。

  技術分享

  2.abp.ajax()方法,abp.ajax以一個對象作為接收選項。你可以傳遞任何在jQuery的$.ajax方法中的參數。 默認值:dataType:‘json’,type:‘POST’,contentType:‘application/json’,

  技術分享

  在 使用 abp.ajax 時也可以不用設置 @Html.AntiForgeryToken()

這是為什麽呢? 原來abp.js在我們請求時自動為我們的請求頭添加了RequestVerificationToken,其名稱為 “X-XSRF-TOKEN”

技術分享

查看ABP的源碼,在AbpAntiForgeryConfiguration中設置了定義了TokenCookieName和TokenHeaderName。一個是token保存在Cookie中時的名字,一個是token在請求頭中被傳輸的名字

技術分享

並且在AbpAspNetCoreModule中自定義了RequestVerificationToken的名字為“X-XSRF-TOKEN”。(這是微軟定義的另一種驗證方式,即不從表單中傳輸和獲取token值,而是從請求頭中獲取。默認的名字是“RequestVerificationToken”當然你也可以自定義它。)

技術分享

當然 token值的獲取在AbpAspNetCoreAntiForgeryManager中,源碼如下。

技術分享

然後給IAbpAntiForgeryManager添加了一個擴展方法:SetCookie

技術分享

最終,在我們的 Account/_Layout.cshtml 和 Shared\_Layout.cshtml 中調用此方法:

技術分享

這也是為什麽在項目測試階段,如果跳過Account/_Layout.cshtml 和 Shared\_Layout.cshtml 步驟之後的請求都不會成功(只報400錯誤)的原因。

那為什麽用abp.ajax 或者 $.ajax時不用設置 @Html.AntiForgeryToken()呢?

  接下來來看看abp.js

技術分享

在 abp.jquery.js中,

技術分享

技術分享

ajaxSend() 方法在 AJAX 請求開始時執行函數。它是一個 Ajax 事件。也就是說 在每個ajax請求前,abp為我們的請求頭上加上了“X-XSRF-TOKEN”。

這就是一整套ABP的AntiForgeryToken獲取和驗證體系。

Abp(.NetCore)開發與發布過程2