Substituição do machineKey do ASP.NET no ASP.NET Core

A implementação do elemento <machineKey> no ASP.NET é substituível. Isso permite que a maioria das chamadas às rotinas criptográficas do ASP.NET sejam roteadas por meio de um mecanismo de proteção de dados de substituição, incluindo o novo sistema de proteção de dados.

Instalação do pacote

Observação

O novo sistema de proteção de dados só pode ser instalado em um aplicativo ASP.NET existente direcionado ao .NET 4.5.1 ou posterior. A instalação falhará se o aplicativo for direcionado ao .NET 4.5 ou inferior.

Para instalar o novo sistema de proteção de dados em um projeto existente do ASP.NET 4.5.1+, instale o pacote Microsoft.AspNetCore.DataProtection.SystemWeb. Isso criará uma instância do sistema de proteção de dados usando as configurações padrão .

Quando você instala o pacote, ele insere uma linha em Web.config que diz ao ASP.NET para usá-lo para a maioria das operações criptográficas, incluindo autenticação de formulários, estado de exibição e chamadas para MachineKey.Protect. Ele não usa a API de proteção de dados. A linha inserida diz o seguinte:

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

Dica

Você pode saber se o novo sistema de proteção de dados está ativo inspecionando campos como __VIEWSTATE, que devem começar com "CfDJ8", como no exemplo abaixo. "CfDJ8" é a representação base64 do cabeçalho mágico "09 F0 C9 F0" que identifica uma carga protegida pelo sistema de proteção de dados.

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="CfDJ8AWPr2EQPTBGs3L2GCZOpk...">

Configuração do pacote

O sistema de proteção de dados é instanciado com uma configuração padrão de configuração zero. No entanto, como por padrão as chaves são mantidas no sistema de arquivos local, isso não funcionará para aplicativos implantados em um farm. Para resolve isso, você pode fornecer configuração criando um tipo que subclasse DataProtectionStartup e substitui seu método ConfigureServices.

Veja abaixo um exemplo de um tipo de inicialização de proteção de dados personalizado que configurou tanto onde as chaves são persistentes quanto como elas são criptografadas em rest. Ele também substitui a política de isolamento de aplicativo padrão fornecendo seu próprio nome de aplicativo.

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");
        }
    }
}

Dica

Você também pode usar <machineKey applicationName="my-app" ... /> no lugar de uma chamada explícita para SetApplicationName. Esse é um mecanismo de conveniência para evitar forçar o desenvolvedor a criar um tipo derivado de DataProtectionStartup se tudo o que ele queria configurar era definir o nome do aplicativo.

Para habilitar essa configuração personalizada, volte para Web.config e procure o elemento <appSettings> que a instalação do pacote adicionou ao arquivo de configuração. Ele se parecerá com a seguinte marcação:

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

Preencha o valor em branco com o nome qualificado para assembly do tipo derivado de DataProtectionStartup que você acabou de criar. Se o nome do aplicativo for DataProtectionDemo, isso será semelhante ao mostrado abaixo.

<add key="aspnet:dataProtectionStartupType"
     value="DataProtectionDemo.MyDataProtectionStartup, DataProtectionDemo" />

O sistema de proteção de dados recém-configurado agora está pronto para uso dentro do aplicativo.