小白開學Asp.Net Core 《八》
— — .Net Core 資料保護元件
1、背景
我在搞(https://github.com/AjuPrince/Aju.Carefree)這個開源專案的時候,想做一些防止惡意攻擊的小功能(如果 我通過頁面 /Dome/GetData?id=123,那是不是不安全呢?是的,我完全可以嘗試著給id賦值後去獲取資料)怎麼辦呢?在.Net Core 中又給如何處理呢?
2、.Net Core 的資料保護元件
1、嘗試著在.Net Core 的內部擴充套件方法中發現
我們都知道在 .Net Core 中註冊服務,都是在 Startup->ConfigureServices 這個方式中 通過 services.AddXXXX 來新增的,我也嘗試著看看 .Net Core 有無內建的資料保護元件,就利用 VS的智慧提示功能 輸入 server.Add 一個個去看,結果就被我我發現了(開心地像個孩子 哈哈)
F12 進去後
通過它的註釋(Extension methods for setting up data protection services in an Microsoft.Extensions.DependencyInjection.IServiceCollection.)(譯成中文:在Microsoft.Extensions.DependencyInjection.IServiceCollection設定資料保護服務的擴充套件方法)。
好,既然找到了,那我們就來學習下它(我們該如何使用它)。
2、學習、使用
既然知道了(.Net Core 內建了資料保護元件),那我也就在類試圖中去找它了,最終還是被我給找見了。(好不廢話了)
我們通過上圖可以知道 .Net Core 內建了一個 IDataProtectionProvider 介面 和 IDataProtector 介面,其中 IDataProtectionProvider 介面是建立保護元件的介面,IDataProtector 是資料保護的介面,我們可以實現這兩個介面,建立資料保護元件。
(肯定有人問我,我怎麼知道的)
同樣的方法,可以去看看,另一個介面。
下面就讓我們來使用它。
1)、新建一個類
public class DataDemoViewModel { public int Id { get; set; } public string Name { get; set; } public DataDemoViewModel(int id, string name) { Id = id; Name = name; } }
2)、建立模擬資料
public class DemoController : Controller { private List<DataDemoViewModel> _listDataProtect = new List<DataDemoViewModel>(); public DemoController(){
//建立模擬資料 for (int i = 0; i < 6; i++) { _listDataProtect.Add(new DataDemoViewModel(i, "Aju_Carefree" + i)); } } }
3)、在Startup類的ConfigureService方法中新增服務
services.AddDataProtection();
4)、在DemoController中 DI注入
public class DemoController : Controller { private List<DataDemoViewModel> _listDataProtect = new List<DataDemoViewModel>(); private readonly IDataProtector _dataProtector; public DemoController(IDataProtectionProvider dataProtectionProvider) { //建立模擬資料 for (int i = 0; i < 6; i++) { _listDataProtect.Add(new DataDemoViewModel(i, "Aju_Carefree" + i)); } _dataProtector = dataProtectionProvider.CreateProtector("aju_carefree_string"); } }
5)、使用
#region 資料保護元件Demo public IActionResult ProtectIndex() { var outputModel = _listDataProtect.Select(item => new {
//使用 IDataProtector 介面的 Protect 方法對id欄位進行加密 Id = _dataProtector.Protect(item.Id.ToString()), item.Name }); return Ok(outputModel); } public IActionResult GetProtect(string id) {
//使用 IDataProtector 介面的 Unprotect 方法對id欄位進行解密 var orignalId = int.Parse(_dataProtector.Unprotect(id)); var outputModel = _listDataProtect.Where(s => s.Id == orignalId); return Ok(outputModel); } #endregion
6)結果展示
(1)請求 /Demo/ProtectIndex
重新整理頁面,id 值是變的。
(2)、請求 /Home/GetProtect?id=(id取了上圖中的第一個(框框圈的))
說明:
(1):使用Provider建立Protector 的時候,我們傳入了一個引數“aju_carefree_string”,這個引數標明瞭這個保護器的用途,也可以當作這個保護器的名字。(不同用途的保護器,不能解密對方方加密的資料)
(2):還有一個型別的資料保護元件(ITimeLimitedDataProtector(帶過期時間的資料保護器))就不在這裡做說明了,用法差不多。
(3):本篇文章,只是對資料保護元件的拋磚引玉(不只是說 它的用法就只能這麼用,完全可以有別的用法。)
(4):本文的程式碼全部上傳至Github(https://github.com/AjuPrince/Aju.Carefree)(DemoController )
參考文章:
如果覺得寫的還不錯的話,就點個推薦唄! 哈哈
下一篇 需求瞭解些什麼呢?留言哦!(我會從留言最多中選擇一個內容來分享 我的看法及使用(當然前提是我會哦 哈哈))
本人有意組建蘭州線下.Net 開發社群,有意者加群(QQ:649708779)如果條件允許的話,將會在8月中旬,組織個活動(只是有這個想法)