小白開學Asp.Net Core 《八》


小白開學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 )

 參考文章:

  https://docs.microsoft.com/zh-cn/aspnet/core/security/data-protection/introduction?view=aspnetcore-3.0

 

  如果覺得寫的還不錯的話,就點個推薦唄! 哈哈

 下一篇 需求了解些什么呢?留言哦!(我會從留言最多中選擇一個內容來分享 我的看法及使用(當然前提是我會哦 哈哈))

   本人有意組建蘭州線下.Net 開發社區,有意者加群(QQ:649708779)如果條件允許的話,將會在8月中旬,組織個活動(只是有這個想法)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM