ASP.NET Core에서 ASP.NET machineKey 교체

<machineKey>ASP.NET에서 요소를 구현할 수 있습니다. 이를 통해 ASP.NET 암호화 루틴에 대한 대부분의 호출을 새 데이터 보호 시스템을 비롯한 대체 데이터 보호 메커니즘을 통해 라우팅할 수 있습니다.

패키지 설치

참고 항목

새 데이터 보호 시스템은 .NET 4.5.1 이상을 대상으로 하는 기존 ASP.NET 애플리케이션에만 설치할 수 있습니다. 애플리케이션이 .NET 4.5 이하를 대상으로 하는 경우 설치는 실패합니다.

기존 ASP.NET 4.5.1+ 프로젝트에 새 데이터 보호 시스템을 설치하려면 Microsoft.AspNetCore.DataProtection.SystemWeb 패키지를 설치합니다. 그러면 기본 구성 설정을 사용하여 데이터 보호 시스템이 인스턴스화됩니다.

패키지를 설치하면 폼 인증, 보기 상태 및 MachineKey.Protect에 대한 호출을 포함하여 대부분의 암호화 작업에 사용할 ASP.NET을 알려 주는 Web.config 줄이 삽입됩니다. 데이터 보호 API를 사용하지 않습니다. 삽입된 줄을 다음과 같이 읽습니다.

<machineKey compatibilityMode="Framework45" dataProtectorType="..." />

아래 예제와 같이 “CfDJ8”로 시작하는 __VIEWSTATE와 같은 필드를 검사하여 새 데이터 보호 시스템이 활성 상태인지 확인할 수 있습니다. “CfDJ8”은 데이터 보호 시스템으로 보호되는 페이로드를 식별하는 매직 “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");
        }
    }
}

SetApplicationName을 명시적으로 호출하는 대신 <machineKey applicationName="my-app" ... />을 사용할 수도 있습니다. 이는 애플리케이션 이름을 설정하는 것만을 원하는 경우 개발자가 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" />

이제 애플리케이션 내에서 새로 구성된 데이터 보호 시스템을 사용할 준비가 되었습니다.