最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年09月30日 11:23:16   作者:LamondLu  
在本篇文章中我們給大家整理了關(guān)于返回主頁.NET Core中的數(shù)據(jù)保護(hù)組件的相關(guān)知識點內(nèi)容,有興趣的朋友們參考下。

背景介紹

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

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

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

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

例: 當(dāng)前我們有一個Movie類,代碼如下, 我們期望當(dāng)獲取Movie對象的時候,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();
 }

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

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

[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ù)"protect_my_query_string", 這個參數(shù)標(biāo)明了這個保護(hù)器的用途,你也可以把它就當(dāng)成這個保護(hù)器的名字。

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

然后我們在MovieController中添加2個Api, 一個是獲取所有Movies對象的,一個是獲取指定Movie對象的

[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方法對Id字段進(jìn)行了加密
  • 相應(yīng)的在獲取單個Movie對象的api中, 我們需要使用IDataProtector接口的Unprotect方法對Id字段進(jìn)行解密。

最終效果

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

[{
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6ygyO6avkgI2teCQGZQShNwsxC9ApDdsnyYd1K5IyNHjhZcRoGd6W31se3W6TWM8H9UdLEPn4fJpS5uKkqUa0PMV6a0ZZHBQSnlGoisSnj29g",
 "title": "泰坦尼克號"
}, {
 "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ù)據(jù)保護(hù)器(Limited Lifetime)

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

.NET Core中, 我們可以使用IDataProtector接口的ToTimeLimitedDataProtector方法創(chuàng)建一個帶過期時間的數(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);
 }

代碼解釋

  • 這里我們定義了一個ITimeLimitedDataProtector接口對象protector, 并在構(gòu)造函數(shù)中使用ToTimeLimitedDataProtector方法,將一個普通的數(shù)據(jù)保護(hù)器轉(zhuǎn)換成了一個帶過期時間的數(shù)據(jù)保護(hù)器
  • 在獲取Movie列表的api中, 我們依然使用Protect方法來加密Id字段, 與之前不同的是,這里我們加入了第二個TimeSpan參數(shù),這個參數(shù)表示了當(dāng)前加密的有效時間只有10秒。

最終效果

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

[{
 "id": "CfDJ8D9KlbQBeipPoQwll5uLR6yzbDbZ931toH32VC6Jqg8DWsrmiLrOxOFFViH4QWZne43jwSVzBjzJIfctYKZniZKNVbr50RRIZpW2fe9UtPajEzBhI-H32Effm-F0ColUaA",
 "title": "泰坦尼克號"
}, {
 "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

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

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

在之前的代碼中,我們在獲取單個Movie的方法中,我們手動調(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)建一個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實現(xiàn)了IActionFilter接口, 并實現(xiàn)了OnActionExecuting和OnActionExecuted方法
  • 在DecryptReferenceFilter類中,我們注入了默認(rèn)的數(shù)據(jù)保護(hù)器提供器,并在構(gòu)造函數(shù)中初始化了一個數(shù)據(jù)保護(hù)器
  • 在OnActionExecuting中我們從RouteData中獲取到未解密的id字段, 然后將其解密之后,替換了之前未解密的id字段,這樣ModelBinder就會使用解密后的字符串來綁定模型。

最終修改

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

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

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

  return Ok(outputModel);
 }

我們在獲取單個Movie的方法上添加了DecryptReference特性。

運行代碼之后,代碼和之前的效果一樣。

源碼地址:http://xiazai.jb51.net/201809/yuanma/id_protector_jb51.rar

相關(guān)文章

  • asp.net Linq TO Sql 分頁方法

    asp.net Linq TO Sql 分頁方法

    臨近春節(jié),手頭工作已告一段落,閑來無事寫了一個 linq to sql 分頁方法。代碼若有不妥之處,請各位高手多提寶貴意見。
    2010-02-02
  • Repeater中嵌套Repeater的示例介紹

    Repeater中嵌套Repeater的示例介紹

    在某些特殊情況下是需要在Repeater中嵌套使用Repeater的,下面有個不錯的示例,感興趣的朋友可以參考下
    2014-01-01
  • ASP.net 路徑問題 詳細(xì)說明

    ASP.net 路徑問題 詳細(xì)說明

    能詳細(xì)解釋一下:Request.ApplicationPath,~/,/,./,../及其用法(可時用)嗎?老是在相對路徑問題上出錯。 問題點數(shù)
    2009-06-06
  • C# WindowsMediaPlayer 的一些用法實例

    C# WindowsMediaPlayer 的一些用法實例

    這篇文章介紹了C# WindowsMediaPlayer 的一些用法實例,有需要的朋友可以參考一下
    2013-09-09
  • c#委托與事件(詳解)

    c#委托與事件(詳解)

    本文中,我將通過兩個范例由淺入深地講述什么是委托、為什么要使用委托、事件的由來、.Net Framework中的委托和事件、委托和事件對Observer設(shè)計模式的意義,對它們的中間代碼也做了討論
    2012-12-12
  • ASP.NET設(shè)計網(wǎng)絡(luò)硬盤之文件夾實現(xiàn)

    ASP.NET設(shè)計網(wǎng)絡(luò)硬盤之文件夾實現(xiàn)

    ASP.NET設(shè)計網(wǎng)絡(luò)硬盤之文件夾實現(xiàn)...
    2006-09-09
  • asp.net Accee數(shù)據(jù)庫連接不穩(wěn)定解決方案

    asp.net Accee數(shù)據(jù)庫連接不穩(wěn)定解決方案

    我最最進(jìn)做了個網(wǎng)站,我是用VS2005 + Access 數(shù)據(jù)庫連接,可以我在連接的時候總是出現(xiàn)連接不穩(wěn)定的情況,同樣的代碼,一個字也沒改,就是連接不上,但是有的又連接的上。真是郁悶,真是弄死人。
    2009-07-07
  • 微軟官方SqlHelper類 數(shù)據(jù)庫輔助操作類

    微軟官方SqlHelper類 數(shù)據(jù)庫輔助操作類

    本文主要介紹微軟官方的數(shù)據(jù)庫操作類極其使用方法,幫助大家利用已經(jīng)非常成熟的類庫來進(jìn)行快速開發(fā)。
    2016-03-03
  • Community Server專題三:HttpModule

    Community Server專題三:HttpModule

    Community Server專題三:HttpModule...
    2007-03-03
  • Discuz!NT數(shù)據(jù)庫讀寫分離方案詳解

    Discuz!NT數(shù)據(jù)庫讀寫分離方案詳解

    Discuz!NT這個產(chǎn)品在其企業(yè)版中提供了對‘讀寫分離’機制的支持,使對CPU及內(nèi)存消耗嚴(yán)重的操作(CUD)被 分離到一臺或幾臺性能很高的機器上,而將頻繁讀取的操作(select)放到幾臺配置較低的機器上,然后通過‘事務(wù) 發(fā)布訂閱機制’,實現(xiàn)了在多個sqlserver數(shù)據(jù)庫之間快速高效同步數(shù)據(jù),從而達(dá)到了將‘讀寫請求’按實際負(fù)載 情況進(jìn)行均衡分布的效果。
    2010-06-06

最新評論

固安县| 百色市| 菏泽市| 黎城县| 朝阳县| 花莲市| 朝阳市| 林甸县| 唐山市| 塔城市| 蓝田县| 峨山| 华亭县| 乾安县| 桑植县| 沾化县| 石景山区| 宿州市| 林周县| 威宁| 宝兴县| 陆河县| 麻江县| 通辽市| 青海省| 垫江县| 天等县| 佛山市| 新丰县| 蕉岭县| 伊宁市| 从江县| 普安县| 铜梁县| 剑河县| 罗定市| 龙口市| 涿鹿县| 郯城县| 收藏| 诸暨市|