不同站台如何使用IDataProtector資料保護API
- 2024-01-29
- 3733
- 0
- IDataProtectionProvider
上一篇講了在.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還有很多設定可以調整,如果有其他需求可以看一下兩篇文章下方的參考連結,看完後應該就可以有很高的掌握度了,各位記得要試試看阿。
回應討論