真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

.NETCore中的數(shù)據(jù)保護(hù)組件有哪些-創(chuàng)新互聯(lián)

本篇文章為大家展示了.NET Core中的數(shù)據(jù)保護(hù)組件有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出靈山免費(fèi)做網(wǎng)站回饋大家。

背景介紹

在 OWASP(開放式 Web 應(yīng)用程序安全項(xiàng)目) 2013 年發(fā)布的報(bào)告中,將不安全的直接對(duì)象引用(Insecure Direct Object Reference)標(biāo)記為 十大 Web 應(yīng)用程序風(fēng)險(xiǎn)之一, 其表現(xiàn)形式是對(duì)象的引用(例如數(shù)據(jù)庫(kù)主鍵)被各種惡意攻擊利用, 所以對(duì)于Api返回的各種主鍵外鍵ID, 我們需要進(jìn)行加密。


.NET Core 的數(shù)據(jù)保護(hù)組件

.NET Core 中內(nèi)置了一個(gè)IDataProtectionProvider接口和一個(gè)IDataProtector接口。其中IDataProtectionProvider是創(chuàng)建保護(hù)組件的接口,IDataProtector是數(shù)據(jù)保護(hù)的接口。開發(fā)人員可以實(shí)現(xiàn)這 2 個(gè)接口,創(chuàng)建數(shù)據(jù)保護(hù)組件。
內(nèi)置的數(shù)據(jù)保護(hù)組件

.NET Core 中默認(rèn)提供了一個(gè)數(shù)據(jù)保護(hù)組件, 下面我們來嘗試使用這個(gè)默認(rèn)組件來保護(hù)我們的數(shù)據(jù)。


例: 當(dāng)前我們有一個(gè)Movie類,代碼如下, 我們期望當(dāng)獲取Movie對(duì)象的時(shí)候,Id字段是加密的。

public class Movie
 {
  public Movie(int id, string title)
  {
   Id = id;
   Title = title;
  }

  public int Id { get; set; }
  public string Title { get; set; }
 }

首先我們需要在Startup.cs中ConfigureService方法中配置使用默認(rèn)的數(shù)據(jù)保護(hù)組件。

public void ConfigureServices(IServiceCollection services)
 {
  services.AddMvc();
  services.AddDataProtection();
 }

這段代碼會(huì)啟用.NET Core默認(rèn)的數(shù)據(jù)保護(hù)器。


然后我們創(chuàng)建一個(gè)MoviesController, 并在構(gòu)造函數(shù)中注入IDataProtectionProvider對(duì)象, 然后使用這個(gè)Provider對(duì)象創(chuàng)建一個(gè)實(shí)現(xiàn)IDataProtector接口的數(shù)據(jù)保護(hù)器對(duì)象

[Route("movies")]
 public class MoviesController : Controller
 {
  private readonly IDataProtector protector;
 
  public MoviesController(IDataProtectionProvider provider)
  {
   this.protector = provider.CreateProtector("protect_my_query_string");
  }
 }

TIPS: 使用Provider創(chuàng)建Protector的時(shí)候,我們傳入了一個(gè)參數(shù)"protect_my_query_string", 這個(gè)參數(shù)標(biāo)明了這個(gè)保護(hù)器的用途,你也可以把它就當(dāng)成這個(gè)保護(hù)器的名字。


注意: 不同用途的保護(hù)器不能解密對(duì)方的加密字符串。, 如果使用了保護(hù)器A去解密保護(hù)器B生成的字符串,會(huì)產(chǎn)生以下異常CryptographicException: The payload was invalid.


然后我們?cè)贛ovieController中添加2個(gè)Api, 一個(gè)是獲取所有Movies對(duì)象的,一個(gè)是獲取指定Movie對(duì)象的

[HttpGet]
 public IActionResult Get()
 {
  var model = GetMovies();
  
  var outputModel = model.Select(item => new
  {
   Id = this.protector.Protect(item.Id.ToString()),
   item.Title,
   item.ReleaseYear,
   item.Summary
  });

  return Ok(outputModel);
 }

 [HttpGet("{id}")]
 public IActionResult Get(string id)
 {
  var orignalId = int.Parse(this.protector.Unprotect(id));

  var model = GetMovies(); 
  
  var outputModel = model.Where(item => item.Id == orignalId);

  return Ok(outputModel);
 }

代碼解釋

  • 在獲取Movie列表的api中,我們使用了IDataProtector接口的Protect方法對(duì)Id字段進(jìn)行了加密

  • 相應(yīng)的在獲取單個(gè)Movie對(duì)象的api中, 我們需要使用IDataProtector接口的Unprotect方法對(duì)Id字段進(jìn)行解密。

最終效果

首先我們調(diào)用/api/movies, 返回結(jié)果如下, id字段已經(jīng)被正確加密了

[{
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6ygyO6avkgI2teCQGZQShNwsxC9ApDdsnyYd1K5IyNHjhZcRoGd6W31se3W6TWM8H9UdLEPn4fJpS5uKkqUa0PMV6a0ZZHBQSnlGoisSnj29g",
 "title": "泰坦尼克號(hào)"
}, {
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6wkMUYyzflIzy3CwoMhcaO-np2WOy4czIL3WZd2FWi7Tsy119tDeFq7yAeye4o2W-KmbffpGXnTDZzNv2QbCrAm7-AyEN35g3pkfAYHa3X7aQ",
 "title": "我是誰"
}, {
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6x2AXM6ulCwts2-uQSfzIU8UquTz-OAZIl-49D5-CYYl5H4mfZH8VihhCBJ60MMrZOlZla9qvb8EIP6GYRkEap4nhktbzGxW0Qu5r3edm6_Kg",
 "title": "蜘蛛俠"
}, {
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6zDZeLtPIVlkRLCd_V6Mr2kTzWsCkfYgmS0-cqhFAOu4dUWGtx6d402_eKnObAOFUClEDdF4mrUeDQawE71DDa805umhbAvX2712i7UgYO5MA",
 "title": "鋼鐵俠"
}]

然后我們繼續(xù)調(diào)用api, 查詢鋼鐵俠的電影信息

/api/movies/CfDJ8D9KlbQBeipPoQwll5uLR6zDZeLtPIVlkRLCd_V6Mr2kTzWsCkfYgmS0-cqhFAOu4dUWGtx6d402_eKnObAOFUClEDdF4mrUeDQawE71DDa805umhbAvX2712i7UgYO5MA

結(jié)果也正確的返回了。

[{"id":4,"title":"鋼鐵俠"}]

帶過期時(shí)間的數(shù)據(jù)保護(hù)器(Limited Lifetime)

.NET Core默認(rèn)還提供了一種帶過期時(shí)間的數(shù)據(jù)保護(hù)器, 這種數(shù)據(jù)保護(hù)器許多使用場(chǎng)景,最常用的場(chǎng)景就是當(dāng)為一個(gè)重置密碼操作的Token設(shè)置失效時(shí)間, 這樣一旦超時(shí)的, Token就不能解密成功, 從而我們就可以認(rèn)定重置密碼操作超時(shí)了。


.NET Core中, 我們可以使用IDataProtector接口的ToTimeLimitedDataProtector方法創(chuàng)建一個(gè)帶過期時(shí)間的數(shù)據(jù)保護(hù)器。


這里我們還是使用默認(rèn)還是繼續(xù)以上面的例子為例, 代碼修改如下

private readonly ITimeLimitedDataProtector protector;

 public MoviesController(IDataProtectionProvider provider)
 {
  this.protector = provider.CreateProtector("protect_my_query_string")
     .ToTimeLimitedDataProtector();
 }

 [HttpGet]
 public IActionResult Get()
 {
  var model = GetMovies(); // simulate call to repository
  
  var outputModel = model.Select(item => new
  {
   Id = this.protector.Protect(item.Id.ToString(), 
          TimeSpan.FromSeconds(10)),
   item.Title,
   item.ReleaseYear,
   item.Summary
  });

  return Ok(outputModel);
 }

代碼解釋

  • 這里我們定義了一個(gè)ITimeLimitedDataProtector接口對(duì)象protector, 并在構(gòu)造函數(shù)中使用ToTimeLimitedDataProtector方法,將一個(gè)普通的數(shù)據(jù)保護(hù)器轉(zhuǎn)換成了一個(gè)帶過期時(shí)間的數(shù)據(jù)保護(hù)器

  • 在獲取Movie列表的api中, 我們依然使用Protect方法來加密Id字段, 與之前不同的是,這里我們加入了第二個(gè)TimeSpan參數(shù),這個(gè)參數(shù)表示了當(dāng)前加密的有效時(shí)間只有10秒。

最終效果

現(xiàn)在我們重新運(yùn)行項(xiàng)目,還是和之前一樣先調(diào)用/api/movies方法來獲取Movies列表, 結(jié)果如下

[{
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6yzbDbZ931toH32VC6Jqg8DWsrmiLrOxOFFViH4QWZne43jwSVzBjzJIfctYKZniZKNVbr50RRIZpW2fe9UtPajEzBhI-H32Effm-F0ColUaA",
 "title": "泰坦尼克號(hào)"
}, {
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6zDDVymvftZK9lKBIjEyuoNTzOEu0SC2-qfTy6quXir2S8f3A1r44f9Yz3Sd_cyLZUp-_4gfJAasMfE8_ngYLrJmdsjN9LZ0g4vox0WJLjiGA",
 "title": "我是誰"
}, {
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6zL-M2jzv2HCeTiHjevkXvI2216NERplp43TOjCXtj4S52ll68sLyQNtG2FhhWlsOmFGvYY5G4gm5SKfASMMgE1jBr20xc2b_djWdLhWLIxnA",
 "title": "蜘蛛俠"
}, {
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6wAoZKCHTG0lvgYS3If_0_eAD30a2YV8RjNagwLXUdCSKsO3kyS58hqDqAPHw_KHwNpd-hjDFl3hFPa8LOWHyk901oc6ZuSxwzxFlljaVreFA",
 "title": "鋼鐵俠"
}]

等待10秒鐘后,我們繼續(xù)調(diào)用api, 查詢鋼鐵俠的電影信息

/api/movies/CfDJ8D9KlbQBeipPoQwll5uLR6wAoZKCHTG0lvgYS3If_0_eAD30a2YV8RjNagwLXUdCSKsO3kyS58hqDqAPHw_KHwNpd-hjDFl3hFPa8LOWHyk901oc6ZuSxwzxFlljaVreFA

返回了錯(cuò)誤信息CryptographicException: The payload expired at 9/29/2018 11:25:05 AM +00:00. 這說明當(dāng)前加密的有效期已過, 不能正確解密了。


Tips: 使用Action Filter解密參數(shù)

在之前的代碼中,我們?cè)讷@取單個(gè)Movie的方法中,我們手動(dòng)調(diào)用了Unprotected方法來解密id屬性

[HttpGet("{id}")]
 public IActionResult Get(string id)
 {
  var orignalId = int.Parse(this.protector.Unprotect(id));

  var model = GetMovies(); // simulate call to repository
  
  var outputModel = model.Where(item => item.Id == orignalId);

  return Ok(outputModel);
 }

下面我們改用Action Filter來改進(jìn)這部分代碼。


首先我們創(chuàng)建一個(gè)DecryptReferenceFilter, 代碼如下:

public class DecryptReferenceFilter : IActionFilter
 {
  private readonly IDataProtector protector;

  public DecryptReferenceFilter(IDataProtectionProvider provider)
  {
   this.protector = provider.CreateProtector("protect_my_query_string");
  }

  public void OnActionExecuting(ActionExecutingContext context)
  {
   object param = context.RouteData.Values["id"].ToString();
   var id = int.Parse(this.protector.Unprotect(param.ToString()));
   context.ActionArguments["id"] = id;
  }

  public void OnActionExecuted(ActionExecutedContext context)
  {

  }
 }

 public class DecryptReferenceAttribute : TypeFilterAttribute
 {
  public DecryptReferenceAttribute() :
   base(typeof(DecryptReferenceFilter))
  { }
 }

代碼解釋

  • 這里DecryptReferenceFilter實(shí)現(xiàn)了IActionFilter接口, 并實(shí)現(xiàn)了OnActionExecuting和OnActionExecuted方法

  • 在DecryptReferenceFilter類中,我們注入了默認(rèn)的數(shù)據(jù)保護(hù)器提供器,并在構(gòu)造函數(shù)中初始化了一個(gè)數(shù)據(jù)保護(hù)器

  • 在OnActionExecuting中我們從RouteData中獲取到未解密的id字段, 然后將其解密之后,替換了之前未解密的id字段,這樣ModelBinder就會(huì)使用解密后的字符串來綁定模型。

最終修改

最后我們修改一下獲取單個(gè)Movie的api, 代碼如下:

[HttpGet("{id}")]
 [DecryptReference]
 public IActionResult Get(int id)
 {
  var model = GetMovies();

  var outputModel = model.Where(item => item.Id == id);

  return Ok(outputModel);
 }

我們?cè)讷@取單個(gè)Movie的方法上添加了DecryptReference特性。


運(yùn)行代碼之后,代碼和之前的效果一樣。

上述內(nèi)容就是.NET Core中的數(shù)據(jù)保護(hù)組件有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享文章:.NETCore中的數(shù)據(jù)保護(hù)組件有哪些-創(chuàng)新互聯(lián)
新聞來源:http://weahome.cn/article/diicds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部