取代 ASP.NET Core 中的 ASP.NET machineKey
ASP.NET 中 <machineKey>
元素的實作是可以取代的 。 這樣可使大部分對於 ASP.NET 密碼編譯常式的呼叫透過取代資料保護機制路由傳送,包括新的資料保護系統。
套件安裝
注意
新的資料保護系統只能安裝到以 .NET 4.5.1 或更新版本為目標的現有 ASP.NET 應用程式。 如果應用程式以 .NET 4.5 或更低版本為目標,安裝將會失敗。
若要將新的資料保護系統安裝至現有的 ASP.NET 4.5.1+ 專案,請安裝套件 Microsoft.AspNetCore.DataProtection.SystemWeb。 這會使用預設組態設定來具現化資料保護系統。
當您安裝套件時,它會將一行插入至 Web.config,告知 ASP.NET 將其用於大部分的密碼編譯作業,包括表單驗證、檢視狀態,以及對 MachineKey.Protect 的呼叫。 它不會使用資料保護 API。 插入的行讀起來如下所示。
<machineKey compatibilityMode="Framework45" dataProtectorType="..." />
提示
您可以檢查如下列範例中類似 __VIEWSTATE
(應該以「CfDJ8」開頭) 的欄位,來判斷新的資料保護系統是否為使用中。 「CfDJ8」是 magic「09 F0 C9 F0」標頭的 base64 表示方式,可識別受資料保護系統保護的承載。
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="CfDJ8AWPr2EQPTBGs3L2GCZOpk...">
套件設定
資料保護系統會以預設的零設定組態具現化。 不過,由於預設會將金鑰保存至本機檔案系統,因此不適用於部署在伺服器陣列中的應用程式。 若要解決此問題,您可以建立 DataProtectionStartup 的子類別類型,並覆寫其 ConfigureServices 方法以提供設定。
以下是自訂資料保護啟動類型的範例,能設定儲存金鑰的位置,還有在 rest 使用到的加密方式。 它也會藉由提供自己的應用程式名稱來覆寫預設應用程式隔離原則。
using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.SystemWeb;
using Microsoft.Extensions.DependencyInjection;
namespace DataProtectionDemo
{
public class MyDataProtectionStartup : DataProtectionStartup
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.SetApplicationName("my-app")
.PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\myapp-keys\"))
.ProtectKeysWithCertificate("thumbprint");
}
}
}
提示
您也可以使用 <machineKey applicationName="my-app" ... />
來取代對 SetApplicationName 的明確呼叫。 這是一種便利機制,可避免強制開發人員在設定應用程式名稱時建立 DataProtectionStartup 的衍生型別。
若要啟用此自訂組態,請返回 Web.config,並尋找由套件安裝新增至設定檔的 <appSettings>
元素。 看起來會像下列標記:
<appSettings>
<!--
If you want to customize the behavior of the ASP.NET Core Data Protection stack, set the
"aspnet:dataProtectionStartupType" switch below to be the fully-qualified name of a
type which subclasses Microsoft.AspNetCore.DataProtection.SystemWeb.DataProtectionStartup.
-->
<add key="aspnet:dataProtectionStartupType" value="" />
</appSettings>
以您剛才建立的 DataProtectionStartup 衍生型別的組件限定類型名稱填入空白值。 如果應用程式的名稱是 DataProtectionDemo,則看起來會如下所示。
<add key="aspnet:dataProtectionStartupType"
value="DataProtectionDemo.MyDataProtectionStartup, DataProtectionDemo" />
新設定的資料保護系統現在已準備好在應用程式內使用。