demoshop

demo, trying to be the best_

上一篇講了在.NET Core使用資料保護API的方式,這一篇就要來說點實務上會遇到的問題,因為是非對稱加密,所以需要有相同的公鑰和私鑰才能解密,但私鑰已經由API自行處理,開發人員甚至不用知道它的存在,可是這樣子在現在很基本的Web farm架構,或是單純的兩個自有服務交換資訊的情境下卻無法使用了,好在.NET Core已經很不一樣了,很多地方都留了設定讓開發人員可以調整

一個堅硬的外殼,中間有「資料」的示意圖,外殼外有很多攻擊行為,顯示外殼堅不可破的保護資料

情境測試

將上一篇做好的範例直接上傳至Azure空間,不管是拿本地端的密文還是雲端的密文,互解都會得到找不到私鑰環的例外

既然已經得到了例外,那首先要解決的就是私鑰共用的部分,API有保留參數設定讓開發人員將私鑰環存到指定位置,支援了以下幾種

  • 檔案系統
  • Azure Blobs
  • Redis
  • 登檔檔
  • 資料庫(EntityFramework Core)

這裡使用 Azure Blobs 處理。

將Key存放到 Azure Blobs

首先要安裝「Azure.Extensions.AspNetCore.DataProtection.Blobs」套件 https://www.nuget.org/packages/Azure.Extensions.AspNetCore.DataProtection.Blobs 

然後調整 Program.cs 檔,因為要設定參數,所以就要明確的寫注入了

builder.Services.AddDataProtection()
       .PersistKeysToAzureBlobStorage("<connection string>", "<container name>", "<blob name>");
  • connection string:至 Azure Storage 取得連線字串貼入。
  • container name:容器名稱(容器請先建立)
  • blob name:blob名稱(如 key.xml 連線後會自動建立)

網頁開啟後你就可以在 Azure Storage 內看到 key.xml 被建立了(沒建立成功通常就是權限問題)

根據預設,資料保護系統會根據應用程式的內容根目錄路徑相互隔離,即使它們共用相同的實體金鑰存放庫也是如此。 此隔離可防止應用程式理解彼此的受保護承載。

所以設定好資料私鑰環共用後依然無法兩個站台互解。若要在應用程式之間共用受保護的承載就必須設定SetApplicationName

builder.Services.AddDataProtection()
       .PersistKeysToAzureBlobStorage("<connection string>", "<container name>", "<blob name>")
       .SetApplicationName("SharedCookieApp");

設定完畢以後兩個站台就可以正確的互解了,這樣應用面就更廣了,當然這個資料保護API還有很多設定可以調整,如果有其他需求可以看一下兩篇文章下方的參考連結,看完後應該就可以有很高的掌握度了,各位記得要試試看阿。

系列文章

回應討論