Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 10 deste artigo.
Este artigo explica o armazenamento em cache de ativos para Blazor WebAssembly e como identificar e resolver problemas de integridade.
Quando um Blazor WebAssembly aplicativo é carregado no navegador, o aplicativo baixa recursos de inicialização do servidor:
- Código JavaScript para inicializar o aplicativo
- Tempo de execução e assemblies do .NET
- Dados específicos da localidade
A Blazor configuração de inicialização, embutida no dotnet.js, contém um manifesto com impressão digital dos arquivos que compõem o aplicativo que devem ser baixados junto com um hash do conteúdo de cada arquivo. Os arquivos do aplicativo são pré-carregados e armazenados em cache pelo navegador.
Observação
†No .NET 10 ou posterior, o arquivo de manifesto blazor.boot.json não está mais presente. Se estiver atualizando um aplicativo que depende do arquivo de manifesto para processamento personalizado, recomendamos coletar as informações diretamente da compilação.
Quando Blazor WebAssembly baixa os arquivos de inicialização de um aplicativo, ele instrui o navegador a executar verificações de integridade nas respostas.
Blazor envia valores de hash SHA-256 para DLL (.dll), WebAssembly (.wasm) e outros arquivos. Os hashes de ficheiros armazenados em cache são comparados aos hashes na configuração de arranque. Um erro é gerado pelo navegador se a verificação de integridade de qualquer arquivo baixado falhar.
Para obter mais informações, consulte as seguintes seções do artigo Fundamentos: Arquivos estáticos :
Exceto para o arquivo de manifesto de inicialização de Blazor (blazor.boot.json), os arquivos de tempo de execução e do pacote de aplicativos do WebAssembly .NET são guardados em cache nos clientes. A Blazor configuração de inicialização contém um manifesto dos ficheiros que compõem a aplicação e que devem ser descarregados, juntamente com um hash do conteúdo do ficheiro, que é usado para detetar se algum dos recursos de inicialização foi alterado.
Blazor armazena em cache os arquivos baixados usando a API de cache do navegador.
Quando Blazor WebAssembly baixa os arquivos de inicialização de um aplicativo, ele instrui o navegador a executar verificações de integridade nas respostas.
Blazor envia valores hash SHA-256 para DLL (.dll), WebAssembly (.wasm) e outros ficheiros na configuração de arranque de Blazor, que não é armazenada em cache nos clientes. Os hashes dos ficheiros em cache são comparados aos hashes na Blazor configuração de inicialização. Para arquivos armazenados em cache com um hash correspondente, Blazor usa os arquivos armazenados em cache. Caso contrário, os arquivos são solicitados do servidor. Depois que um arquivo é baixado, seu hash é verificado novamente para validação de integridade. Um erro é gerado pelo navegador se a verificação de integridade de qualquer arquivo baixado falhar.
Blazoralgoritmo para gerir a integridade do ficheiro:
- Garante que o aplicativo não corra o risco de carregar um conjunto inconsistente de arquivos, por exemplo, se uma nova implantação for aplicada ao seu servidor Web enquanto o usuário estiver no processo de download dos arquivos do aplicativo. Arquivos inconsistentes podem resultar em um aplicativo com defeito.
- Garante que o navegador do usuário nunca armazene em cache respostas inconsistentes ou inválidas, o que pode impedir que o aplicativo seja iniciado, mesmo que o usuário atualize manualmente a página.
- Torna seguro armazenar em cache as respostas e não verificar se há alterações no servidor até que os próprios hashes SHA-256 esperados mudem, para que os carregamentos de página subsequentes envolvam menos solicitações e sejam concluídos mais rapidamente.
Se o servidor Web retornar respostas que não correspondem aos hashes SHA-256 esperados, um erro semelhante ao exemplo a seguir será exibido no console do desenvolvedor do navegador:
Não foi possível encontrar um resumo válido no atributo 'integridade' para o recurso 'https://myapp.example.com/_framework/MyBlazorApp.dll' com integridade SHA-256 computada 'IIa70iwvmEg5WiDV17OpQ5eCztNYqL186J56852RpJY='. O recurso foi bloqueado.
Na maioria dos casos, o aviso não indica um problema com a verificação de integridade. Em vez disso, o aviso geralmente significa que existe algum outro problema.
Para obter a fonte de referência de inicialização do Blazor WebAssembly, consulte o arquivo Boot.WebAssembly.ts no repositório dotnet/aspnetcore GitHub.
Observação
Os links de documentação para a fonte de referência do .NET geralmente carregam a ramificação padrão do repositório, que representa o desenvolvimento atual para a próxima versão do .NET. Para selecionar uma tag para uma versão específica, use a lista suspensa Alternar entre ramificações ou tags. Para obter mais informações, consulte Como selecionar uma marca de versão do código-fonte do ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Diagnosticar problemas de integridade
Quando um aplicativo é criado, o manifesto de inicialização gerado descreve os hashes SHA-256 de recursos de inicialização no momento em que a saída de compilação é produzida. A verificação de integridade passa desde que os hashes SHA-256 no manifesto de inicialização correspondam aos arquivos entregues ao navegador.
As razões comuns pelas quais isso não acontece incluem:
- A resposta do servidor Web é um erro (por exemplo, um 404 - Not Found ou um 500 - Internal Server Error) em vez do ficheiro que o navegador solicitou. Isso é relatado pelo navegador como uma falha de verificação de integridade e não como uma falha de resposta.
- Algo mudou o conteúdo dos arquivos entre a compilação e a entrega dos arquivos para o navegador. Isto pode acontecer:
- Se você ou as ferramentas de compilação modificarem manualmente a saída da compilação.
- Se algum aspeto do processo de implantação modificou os arquivos. Por exemplo, se utilizares um mecanismo de implantação baseado em Git, tem em conta que o Git converte de forma transparente terminações de linha no estilo Windows para terminações de linha no estilo Unix se confirmares ficheiros no Windows e os extraires no Linux. A alteração das terminações das linhas de arquivo altera os hashes SHA-256. Para evitar esse problema, considere usando
.gitattributespara tratar artefatos de compilação como arquivosbinary. - O servidor web modifica o conteúdo do ficheiro durante o processo de entrega. Por exemplo, algumas redes de distribuição de conteúdo (CDNs) tentam automaticamente minificar HTML, modificando-o. Pode ser necessário desativar esses recursos.
- O manifesto de inicialização não é carregado corretamente ou é armazenado incorretamente em cache no cliente. As causas comuns incluem uma das seguintes:
- Código de desenvolvedor personalizado mal configurado ou com mau funcionamento.
- Uma ou mais camadas de cache intermediárias mal configuradas.
Para diagnosticar qual delas se aplica no seu caso:
- Observe qual arquivo está disparando o erro lendo a mensagem de erro.
- Abra as ferramentas de desenvolvedor do seu navegador e procure na guia Rede
. Se necessário, recarregue a página para ver a lista de solicitações e respostas. Localize o arquivo que está disparando o erro nessa lista. - Verifique o código de status HTTP na resposta. Se o servidor retornar qualquer coisa diferente de 200 - OK (ou outro código de status 2xx), então você tem um problema do lado do servidor para diagnosticar. Por exemplo, o código de status 403 significa que há um problema de autorização, enquanto o código de status 500 significa que o servidor está falhando de maneira não especificada. Consulte os logs do servidor para diagnosticar e corrigir o aplicativo.
- Se o código de status for 200 - OK para o recurso, examine o conteúdo da resposta nas ferramentas de desenvolvimento do navegador e verifique se o conteúdo corresponde aos dados esperados. Por exemplo, um problema comum é configurar incorretamente o roteamento para que as solicitações retornem seus dados
index.html, mesmo para outros arquivos. Certifique-se de que as respostas aos pedidos.wasmsão binários de WebAssembly e que as respostas aos pedidos.dllsão binários de assembly .NET. Se não, você tem um problema de roteamento do lado do servidor para diagnosticar.
- Observe qual arquivo está disparando o erro lendo a mensagem de erro.
- Abra as ferramentas de desenvolvedor do seu navegador e procure na guia Rede
. Se necessário, recarregue a página para ver a lista de solicitações e respostas. Localize o arquivo que está disparando o erro nessa lista. - Verifique o código de status HTTP na resposta. Se o servidor retornar qualquer coisa diferente de 200 - OK (ou outro código de status 2xx), então você tem um problema do lado do servidor para diagnosticar. Por exemplo, o código de status 403 significa que há um problema de autorização, enquanto o código de status 500 significa que o servidor está falhando de maneira não especificada. Consulte os logs do servidor para diagnosticar e corrigir o aplicativo.
- Se o código de status for 200 - OK para o recurso, examine o conteúdo da resposta nas ferramentas de desenvolvimento do navegador e verifique se o conteúdo corresponde aos dados esperados. Por exemplo, um problema comum é configurar incorretamente o roteamento para que as solicitações retornem seus dados
index.html, mesmo para outros arquivos. Certifique-se de que as respostas aos pedidos.wasmsão binários de WebAssembly e que as respostas aos pedidos.dllsão binários de assembly .NET. Se não, você tem um problema de roteamento do lado do servidor para diagnosticar. - Tente validar a saída publicada e implantada da aplicação com o script PowerShell de Resolução de problemas de integridade .
Se você confirmar que o servidor está retornando dados plausivelmente corretos, deve haver algo mais modificando o conteúdo entre a compilação e a entrega do arquivo. Para investigar isso:
- Examine a cadeia de ferramentas de compilação e o mecanismo de implantação caso eles estejam modificando arquivos depois que os arquivos forem criados. Um exemplo disso é quando o Git transforma terminações de linha de arquivo, conforme descrito anteriormente.
- Examine a configuração do servidor Web ou da CDN caso eles estejam configurados para modificar respostas dinamicamente (por exemplo, tentando reduzir o HTML). Não há problema em o servidor Web implementar a compactação HTTP (por exemplo, retornar
content-encoding: broucontent-encoding: gzip), já que isso não afeta o resultado após a descompressão. No entanto, não é aceitável que o servidor web modifique os dados não compactados.
Solucionar problemas de integridade do script PowerShell
Use o script do integrity.ps1 PowerShell para validar um aplicativo Blazor publicado e implantado. O script é fornecido para o PowerShell Core 7 ou posterior como um ponto de partida quando o aplicativo tem problemas de integridade que a estrutura Blazor não consegue identificar. A personalização do script pode ser necessária para seus aplicativos, inclusive se executados na versão do PowerShell posterior à versão 7.2.0.
O script verifica os ficheiros na pasta publish e os que foram baixados do aplicativo implantado para detetar problemas nos diferentes manifests que contêm hashes de integridade. Essas verificações devem detetar os problemas mais comuns:
- Você modificou um arquivo na saída publicada sem perceber.
- O aplicativo não foi implantado corretamente no destino de implantação ou algo mudou no ambiente do destino de implantação.
- Existem diferenças entre a aplicação implementada e o resultado da publicação da aplicação.
Invoque o script com o seguinte comando em um shell de comando do PowerShell:
.\integrity.ps1 {BASE URL} {PUBLISH OUTPUT FOLDER}
No exemplo a seguir, o script é executado em um aplicativo executado localmente em https://localhost:5001/:
.\integrity.ps1 https://localhost:5001/ C:\TestApps\BlazorSample\bin\Release\net6.0\publish\
Marcadores de posição:
-
{BASE URL}: A URL do aplicativo implantado. É necessária uma barra final (/). -
{PUBLISH OUTPUT FOLDER}: O caminho para a pastapublishdo aplicativo ou local onde o aplicativo é publicado para implantação.
Observação
Ao clonar o repositório dotnet/AspNetCore.Docs GitHub, o script integrity.ps1 pode ser colocado em quarentena por Bitdefender ou outro verificador de vírus presente no sistema. Normalmente, o arquivo é preso pela tecnologia de varredura heurística de varredura de vírus, que apenas procura padrões em arquivos que podem indicar a presença de malware. Para impedir que o verificador de vírus coloque o ficheiro em quarentena, adicione uma exceção ao verificador de vírus antes de clonar o repositório. O exemplo a seguir é um caminho típico para o script em um sistema Windows. Ajuste o percurso conforme necessário para outros sistemas. O espaço reservado {USER} representa o segmento do caminho do utilizador.
C:\Users\{USER}\Documents\GitHub\AspNetCore.Docs\aspnetcore\blazor\host-and-deploy\webassembly\_samples\integrity.ps1
Aviso: Criar exceções do verificador de vírus é perigoso e só deve ser executado quando você tiver certeza de que o arquivo é seguro.
Comparar a soma de verificação de um arquivo com um valor de soma de verificação válido não garante a segurança do arquivo, mas modificar um arquivo de forma a manter um valor de soma de verificação não é trivial para usuários mal-intencionados. Portanto, as somas de verificação são úteis como abordagem de segurança geral. Compare a soma de verificação do arquivo integrity.ps1 local com um dos seguintes valores:
- SHA256:
32c24cb667d79a701135cb72f6bae490d81703323f61b8af2c7e5e5dc0f0c2bb - MD5:
9cee7d7ec86ee809a329b5406fbf21a8
Obtenha a soma de verificação do arquivo no sistema operacional Windows com o seguinte comando. Forneça o caminho e o nome do arquivo para o espaço reservado {PATH AND FILE NAME} e indique o tipo de soma de verificação a ser produzida para o espaço reservado {SHA512|MD5}, SHA256 ou MD5:
CertUtil -hashfile {PATH AND FILE NAME} {SHA256|MD5}
Se você tiver algum motivo para se preocupar que a validação da soma de verificação não é segura o suficiente em seu ambiente, consulte a liderança de segurança da sua organização para obter orientação.
Para obter mais informações, consulte Visão geral da proteção contra ameaças pelo Microsoft Defender Antivirus.
Desativar a verificação de integridade para aplicativos que não sejam PWA
Na maioria dos casos, não desative a verificação de integridade. Desativar a verificação de integridade não resolve o problema subjacente que causou as respostas inesperadas e resulta na perda dos benefícios listados anteriormente.
Pode haver casos em que o servidor Web não possa ser confiável para retornar respostas consistentes, e você não tem escolha a não ser desativar temporariamente as verificações de integridade até que o problema subjacente seja resolvido.
Para desativar as verificações de integridade, carregue manualmente os recursos de inicialização do lado do cliente e evite passar o integrity parâmetro para a fetch chamada.
Para desativar as verificações de integridade, adicione o seguinte a um grupo de propriedades no arquivo de projeto do aplicativo Blazor WebAssembly (.csproj):
<BlazorCacheBootResources>false</BlazorCacheBootResources>
BlazorCacheBootResources também desabilita o comportamento padrão do Blazorde armazenar em cache os arquivos .dll, .wasme outros com base em seus hashes SHA-256 porque a propriedade indica que os hashes SHA-256 não podem ser considerados para correção. Mesmo com essa configuração, o cache HTTP normal do navegador ainda pode armazenar esses arquivos em cache, mas se isso acontece ou não depende da configuração do seu servidor Web e dos cabeçalhos cache-control que ele serve.
Observação
A propriedade BlazorCacheBootResources não desativa as verificações de integridade para Progressive Web Applications (PWAs). Para obter orientações referentes a PWAs, consulte a seção Desabilitar a verificação de integridade para PWAs.
Não podemos fornecer uma lista exaustiva de cenários em que a desativação da verificação de integridade é necessária. Os servidores podem responder a uma solicitação de maneiras arbitrárias fora do escopo da estrutura Blazor. A estrutura permite que a abordagem anterior torne o aplicativo executável ao custo de perder uma garantia de integridade que o aplicativo pode fornecer. Mais uma vez, não recomendamos desativar a verificação de integridade, especialmente para implantações de produção. Os desenvolvedores devem procurar resolver o problema de integridade subjacente que está causando falha na verificação de integridade.
Alguns casos gerais que podem causar problemas de integridade são:
- Em execução em HTTP onde a integridade não pode ser verificada.
- Se o seu processo de implantação modifica os arquivos após a publicação de qualquer forma.
- Se o seu anfitrião modificar os ficheiros de alguma forma.
Desativar a verificação de integridade para PWAs
O modelo de Aplicação Web Progressiva (PWA) do Blazorcontém um arquivo service-worker.published.js sugerido que é responsável por buscar e armazenar ficheiros da aplicação para uso offline. Este é um processo separado do mecanismo normal de inicialização do aplicativo e tem sua própria lógica de verificação de integridade separada.
Dentro do arquivo service-worker.published.js, a seguinte linha está presente:
.map(asset => new Request(asset.url, { integrity: asset.hash }));
Para desativar a verificação de integridade, remova o parâmetro integrity alterando a linha para o seguinte:
.map(asset => new Request(asset.url));
Mais uma vez, desativar a verificação de integridade significa que você perde as garantias de segurança oferecidas pela verificação de integridade. Por exemplo, há um risco de que, se o navegador do usuário estiver armazenando o aplicativo em cache no momento exato em que você implanta uma nova versão, ele poderá armazenar em cache alguns arquivos da implantação antiga e alguns da nova implantação. Se isso acontecer, o aplicativo ficará preso em um estado quebrado até que você implante uma nova atualização.