取代 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 方法以提供設定。

以下是自訂資料保護啟動類型的範例,其中設定了保存金鑰的位置,以及其待用加密方式。 它也會藉由提供自己的應用程式名稱來覆寫預設應用程式隔離原則。

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" />

新設定的資料保護系統現在已準備好在應用程式內使用。