evento
19/11, 23 - 21/11, 23
Participe de sessões on-line no Microsoft Ignite criadas para expandir suas habilidades e ajudá-lo a lidar com os problemas complexos de hoje.
Registe-se agoraEste browser já não é suportado.
Atualize para o Microsoft Edge para tirar partido das mais recentes funcionalidades, atualizações de segurança e de suporte técnico.
Nota
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, consulte a Política de Suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Este artigo explica como proteger aplicativos Blazor do lado do servidor como aplicativos ASP.NET Core.
Os aplicativos Blazor do lado do servidor são configurados para segurança da mesma forma que os aplicativos ASP.NET Core. Para obter mais informações, consulte os artigos em Tópicos de segurança do ASP.NET Core.
O contexto de autenticação só é estabelecido quando o aplicativo é iniciado, ou seja, quando o aplicativo se conecta pela primeira vez ao WebSocket. O contexto de autenticação é mantido durante o tempo de vida do circuito. Os aplicativos revalidam periodicamente o estado de autenticação do usuário a cada 30 minutos.
Se o aplicativo precisar capturar usuários para serviços personalizados ou reagir a atualizações para o usuário, confira Cenários de segurança adicionais do Blazor do ASP.NET Core do lado do servidor.
Blazor difere de aplicativos Web tradicionais renderizados pelo servidor que fazem novas solicitações HTTP com cookies em cada navegação de página. A autenticação é verificada durante eventos de navegação. No entanto, cookies não estão envolvidos. Cookies são enviados somente ao fazer uma solicitação HTTP a um servidor, o que não ocorre quando o usuário navega em um aplicativo do Blazor. Durante a navegação, o estado de autenticação do usuário é verificado no Blazorcircuito do SignalR , que você pode atualizar a qualquer momento no servidor usando um ](#additional-authentication-state-providers de revalidação AuthenticationStateProvider
).
Importante
Não é recomendável implementar um NavigationManager
personalizado para obter validação de autenticação durante a navegação. Se o aplicativo precisar executar a lógica de estado de autenticação personalizada durante a navegação, use um personalizado AuthenticationStateProvider
.
Nota
Os exemplos de código neste artigo adotam tipos de referência anuláveis (NRTs) e análise estática de estado nulo do compilador do .NET, que têm suporte no ASP.NET Core no .NET 6 ou posterior. Ao usar o ASP.NET Core 5.0 ou anterior, remova a designação de tipo nulo (?
) dos exemplos deste artigo.
Em ambientes de teste/preparo e produção, o código do lado do Blazor servidor e as APIs Web devem usar fluxos de autenticação seguros que evitam a manutenção de credenciais no código do projeto ou nos arquivos de configuração. Fora dos testes de desenvolvimento local, recomendamos evitar o uso de variáveis de ambiente para armazenar dados confidenciais, pois as variáveis de ambiente não são a abordagem mais segura. Para testes de desenvolvimento local, a ferramenta Gerenciador de segredos é recomendada para proteger dados confidenciais. Para saber mais, consulte os recursos a seguir:
Para desenvolvimento e teste local do lado do cliente e do lado do servidor, use a ferramenta Secret Manager para proteger credenciais confidenciais.
Crie um novo aplicativo Blazor do lado do servidor seguindo as diretrizes em Ferramentas para Blazor do ASP.NET Core.
Depois de escolher o modelo de aplicativo do lado do servidor e configurar o projeto, selecione a autenticação do aplicativo em Tipo de autenticação:
Blazor dá suporte à geração de uma interface do usuário Identity completa baseada em Blazor quando você escolhe a opção de autenticação para Contas Individuais.
O modelo do Blazor Web App faz o scaffold de código do Identity em um banco de dados do SQL Server. A versão da linha de comando usa SQLite e inclui um banco de dados SQLite para Identity.
O modelo :
_Imports.razor
.ApplicationUser
).ApplicationDbContext
).Para inspecionar os componentes Identity da estrutura Blazor, acesse-os nas pastas Pages
e Shared
da pasta da Account
no modelo de projeto do Blazor Web App (fonte de referência).
Quando você escolhe os modos de renderização interativa WebAssembly ou renderização automática, o servidor lida com todas as solicitações de autenticação e autorização, e os componentes Identity são renderizados estaticamente no servidor no projeto principal do Blazor Web App.
A estrutura fornece um AuthenticationStateProvider personalizado nos projetos do servidor e do cliente (.Client
) para o fluxo do estado de autenticação do usuário para o navegador. O projeto do servidor chama AddAuthenticationStateSerialization, enquanto o projeto do cliente chama AddAuthenticationStateDeserialization. A autenticação no servidor em vez de no cliente permite que o aplicativo acesse o estado de autenticação durante a pré-renderização e antes que o runtime do .NET WebAssembly seja inicializado. As implementações AuthenticationStateProvider personalizadas usam o serviço Estado de Componente Persistente (PersistentComponentState) para serializar o estado de autenticação em comentários HTML e, em seguida, lê-lo de volta do WebAssembly para criar uma instância AuthenticationState. Para mais informações, consulte a seção Gerenciar o estado da autenticação em Blazor Web Apps.
Somente para soluções de Servidor Interativo, IdentityRevalidatingAuthenticationStateProvider
(fonte de referência) é um AuthenticationStateProvider lado do servidor que revalida o carimbo de segurança do usuário conectado a cada 30 minutos em que um circuito interativo está conectado.
Quando você escolhe os modos de renderização interativa WebAssembly ou renderização automática, o servidor lida com todas as solicitações de autenticação e autorização, e os componentes Identity são renderizados estaticamente no servidor no projeto principal do Blazor Web App. O modelo de projeto inclui uma classe PersistentAuthenticationStateProvider
(fonte de referência) no projeto .Client
para sincronizar o estado de autenticação do usuário entre o servidor e o navegador. A classe é uma implementação personalizada de AuthenticationStateProvider. O provedor usa o serviço Estado Persistente do Componente (PersistentComponentState) para pré-renderizar o estado de autenticação e mantê-lo na página.
No projeto principal de um Blazor Web App, o provedor de estado de autenticação se chama IdentityRevalidatingAuthenticationStateProvider
(fonte de referência) (somente as soluções de interatividade do servidor) ou PersistingRevalidatingAuthenticationStateProvider
(fonte de referência) (soluções de interatividade WebAssembly ou Automática).
BlazorIdentity depende de instâncias DbContext não criadas por uma fábrica, o que é intencional porque DbContext é suficiente para que os componentes Identity do modelo de projeto sejam renderizados estaticamente sem dar suporte à interatividade.
Para obter uma descrição sobre como os modos de renderização interativos globais são aplicados a componentes nãoIdentity e, ao mesmo tempo, impõem SSR estático para os componentes Identity, consulte ASP.NET Core Blazor Modos de renderização.
Para obter mais informações sobre como persistir o estado pré-renderizado, confira Pré-renderizar componentes do ASP.NET Core Razor .
Nota
Os links de documentação para a fonte de referência do .NET geralmente carregam o branch padrão do repositório, que representa o desenvolvimento atual da próxima versão do .NET. Para selecionar uma marca para uma versão específica, use a lista suspensa para Alternar branches ou marcas. Para saber mais, confira Como selecionar uma marca de versão do código-fonte do ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Esta seção se aplica a Blazor Web Apps que adotam:
Um provedor de estado de autenticação do lado do cliente é usado somente em Blazor e não está integrado ao sistema de autenticação do ASP.NET Core. Durante a pré-renderização, Blazor respeita os metadados definidos na página e usa o sistema de autenticação ASP.NET Core para determinar se o usuário está autenticado. Quando um usuário navega de uma página para outra, é usado um provedor de autenticação no lado do cliente. Quando o usuário atualiza a página (recarrega a página inteira), o provedor de estado de autenticação do lado do cliente não está envolvido na decisão de autenticação no servidor. Como o estado do usuário não é mantido pelo servidor, qualquer estado de autenticação mantido no lado do cliente é perdido.
Para resolver isso, a melhor abordagem é realizar a autenticação no sistema de autenticação do ASP.NET Core. O provedor de estado de autenticação no lado do cliente só se encarrega de refletir o estado de autenticação do usuário. Exemplos de como fazer isso com provedores de estado de autenticação são demonstrados pelo modelo de projeto do Blazor Web App e descritos abaixo.
No arquivo Program
do projeto do servidor, chame AddAuthenticationStateSerialization, que serializa o AuthenticationState retornado pelo AuthenticationStateProvider do lado do servidor usando o serviço Estado Persistente do Componente (PersistentComponentState):
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization();
A API só serializa as declarações de nome e função do lado do servidor para acesso no navegador. Para incluir todas as declarações, defina SerializeAllClaims
para true
na chamada do lado do servidor para AddAuthenticationStateSerialization:
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization(
options => options.SerializeAllClaims = true);
No arquivo Program
do projeto do cliente (.Client
), chame AddAuthenticationStateDeserialization, que adiciona um AuthenticationStateProvider em que o AuthenticationState é desserializado do servidor usando AuthenticationStateData
e o serviço Estado Persistente do Componente (PersistentComponentState). Deve haver uma chamada correspondente para AddAuthenticationStateSerialization no projeto do servidor.
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
PersistingRevalidatingAuthenticationStateProvider
(fonte de referência): para Blazor Web Apps que adotam a SSR interativa (renderização interativa do lado do servidor) e a CSR (renderização do lado do cliente). Este é um AuthenticationStateProvider do lado do servidor que revalida o selo de segurança para o usuário conectado a cada 30 minutos em que um circuito interativo está conectado. Ele também usa o serviço Estado do Componente Persistente para transmitir o estado de autenticação ao cliente, que é então fixado para o tempo de vida da CSR.
PersistingServerAuthenticationStateProvider
(fonte de referência): para Blazor Web Apps que adotam apenas a CSR. Esse é um AuthenticationStateProvider do lado do servidor que usa o serviço de Estado de Componente Persistente para transmitir o estado de autenticação ao cliente, que é então fixado para o tempo de vida da CSR.
PersistentAuthenticationStateProvider
(fonte de referência): para Blazor Web Apps que adotam a CSR. Esse é um AuthenticationStateProvider do lado do cliente que determina o estado de autenticação do usuário procurando dados persistentes na página quando ela foi renderizada no servidor. Esse estado de autenticação é fixo durante a vida útil da CSR. Se o usuário precisar fazer logon ou logout, será necessário recarregar a página inteira. Isso fornece apenas um nome de usuário e email para fins de exibição. Ele não inclui tokens que autenticam o servidor ao fazer solicitações subsequentes, que são tratadas separadamente usando um cookie que é incluído nas solicitações HttpClient
ao servidor.
Nota
Os links de documentação para a fonte de referência do .NET geralmente carregam o branch padrão do repositório, que representa o desenvolvimento atual da próxima versão do .NET. Para selecionar uma marca para uma versão específica, use a lista suspensa para Alternar branches ou marcas. Para saber mais, confira Como selecionar uma marca de versão do código-fonte do ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Para obter mais informações sobre scaffolding Identity em um aplicativo Blazor do lado do servidor, confira Scaffolding Identity em projetos ASP.NET Core.
Faça scaffold Identity em um aplicativo Blazor do lado do servidor:
Para armazenar declarações adicionais de provedores externos, consulte Persistir declarações e tokens adicionais de provedores externos no ASP.NET Core.
Especifique o emissor explicitamente ao implantar no Serviço de Aplicativo do Azure no Linux com o Identity Server. Para obter mais informações, confira Usar o Identity para proteger um back-end da API Web para SPAs.
Não tente resolver AuthenticationStateProvider dentro de um serviço que está no escopo de um componente OwningComponentBase
porque isso resulta na criação de uma nova instância do AuthenticationStateProvider que não foi inicializada corretamente.
Para acessar o AuthenticationStateProvider dentro de um serviço com escopo para um componente, injete o AuthenticationStateProvider diretamente no componente e passe a instância de serviço para o serviço com escopo como um parâmetro. Essa abordagem garante que a instância correta inicializada do AuthenticationStateProvider seja usada para cada instância de aplicativo de usuário.
ExampleService.cs
:
public class ExampleService
{
public async Task<string> ExampleMethod(AuthenticationStateProvider authStateProvider)
{
var authState = await authStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity is not null && user.Identity.IsAuthenticated)
{
return $"{user.Identity.Name} is authenticated.";
}
else
{
return "The user is NOT authenticated.";
}
}
}
Program
No arquivo, o ExampleService
é registrado como um serviço com escopo. Neste exemplo, o serviço tem como escopo um componente com OwningComponentBase. Para obter diretrizes gerais sobre o tempo de vida dos serviços com escopo, consulte Injeção de dependência no ASP.NET Core.
.AddScoped<ExampleService>();
No seguinte componente InjectAuthStateProvider
:
ExampleService.ExampleMethod
.ExampleService
é resolvido com OwningComponentBase.ScopedServices e GetRequiredService, que retorna a instância correta inicializada do ExampleService
que existe durante o tempo de vida do circuito do usuário.InjectAuthStateProvider.razor
:
@page "/inject-auth-state-provider"
@inherits OwningComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider
<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>
<p>@message</p>
@code {
private string? message;
private ExampleService? ExampleService { get; set; }
protected override async Task OnInitializedAsync()
{
ExampleService = ScopedServices.GetRequiredService<ExampleService>();
message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
}
}
Para obter mais informações, consulte as diretrizes de OwningComponentBase em Injeção de dependência Blazor no ASP.NET Core.
AuthenticationStateProvider
personalizadoPara evitar a exibição de conteúdo não autorizado, por exemplo, conteúdo em um componente AuthorizeView
, durante a pré-renderização com um AuthenticationStateProvider
personalizado, adote uma das seguintes abordagens:
Implementar IHostEnvironmentAuthenticationStateProvider para o AuthenticationStateProvider personalizado e dar suporte à pré-renderização: para obter um exemplo de implementação de IHostEnvironmentAuthenticationStateProvider, confira a implementação Blazor da estrutura em ServerAuthenticationStateProviderServerAuthenticationStateProvider.cs
(fonte de referência).
Nota
Os links de documentação para a fonte de referência do .NET geralmente carregam o branch padrão do repositório, que representa o desenvolvimento atual da próxima versão do .NET. Para selecionar uma marca para uma versão específica, use a lista suspensa para Alternar branches ou marcas. Para saber mais, confira Como selecionar uma marca de versão do código-fonte do ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Desabilitar a pré-renderização: indique o modo de renderização com o parâmetro prerender
definido como false
no componente de nível mais alto na hierarquia de componentes do aplicativo que não seja um componente raiz.
Nota
Não há suporte para tornar um componente raiz interativo, como o componente App
. Portanto, a pré-renderização não pode ser desabilitada diretamente pelo componente App
.
Para aplicativos com base no modelo de projeto do Blazor Web App, a pré-renderização normalmente é desabilitada quando o componente Routes
é usado no componente App
(Components/App.razor
):
<Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Além disso, desabilite a pré-geração para o componente HeadOutlet
:
<HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Você também pode controlar de maneira seletiva o modo de renderização aplicado à instância do componente Routes
. Por exemplo, confira Modos de renderização do ASP.NET Core Blazor.
Desabilitar a pré-renderização: abra o arquivo _Host.cshtml
e altere o atributo render-mode
do Component Tag Helper para Server:
<component type="typeof(App)" render-mode="Server" />
Apesar da palavra "estado" no nome, AuthenticationStateProvider não é para armazenar o estado geral do usuário. AuthenticationStateProvider indica apenas o estado de autenticação do usuário para o aplicativo, se ele está conectado ao aplicativo e como ele está conectado.
A autenticação usa a mesma autenticação Identity do ASP.NET Core que os aplicativos Razor Pages e MVC. O estado do usuário armazenado para ASP.NET Core Identity flui sem Blazor adicionar código ao aplicativo. Siga as diretrizes nos artigos e tutoriais Identity do ASP.NET Core para que os recursos Identity entrem em vigor nas partes Blazor do aplicativo.
Para obter diretrizes sobre o gerenciamento de estado geral fora do ASP.NET Core Identity, consulte Gerenciamento de estado Blazor do ASP.NET Core.
Duas classes adicionais derivadas da ajuda com o gerenciamento do estado de AuthenticationStateProvider autenticação no servidor:
ServerAuthenticationStateProvider (fonte de referência): um padrão AuthenticationStateProvider usado pela estrutura para gerenciar o Blazor estado de autenticação no servidor quando um provedor mais específico não está registrado.
RevalidatingServerAuthenticationStateProvider (fonte de referência): uma classe base para AuthenticationStateProvider serviços que recebem um estado de autenticação do ambiente de host e o revalidam em intervalos regulares. Consulte o modelo de Blazor Web App projeto para obter um exemplo de implementação. Substitua RevalidationInterval para alterar o intervalo de revalidação padrão de 30 minutos.
Nota
Os links de documentação para a fonte de referência do .NET geralmente carregam o branch padrão do repositório, que representa o desenvolvimento atual da próxima versão do .NET. Para selecionar uma marca para uma versão específica, use a lista suspensa para Alternar branches ou marcas. Para saber mais, confira Como selecionar uma marca de versão do código-fonte do ASP.NET Core (dotnet/AspNetCore.Docs #26205).
O lado do servidor Blazor persiste o estado de autenticação do usuário durante o tempo de vida do circuito, inclusive nas guias do navegador. Para desconectar proativamente um usuário nas guias do navegador quando o usuário sair de uma guia, você deve implementar um RevalidatingServerAuthenticationStateProvider (fonte de referência) com um RevalidationInterval curto.
Nota
Os links de documentação para a fonte de referência do .NET geralmente carregam o branch padrão do repositório, que representa o desenvolvimento atual da próxima versão do .NET. Para selecionar uma marca para uma versão específica, use a lista suspensa para Alternar branches ou marcas. Para saber mais, confira Como selecionar uma marca de versão do código-fonte do ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Esta seção aplica a Blazor Web Apps.
Use a opção RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration para obter ou definir o tempo de vida da validade da Proteção de dados do ASP.NET Core para URLs de redirecionamento temporário emitidas pela renderização do lado do servidor do Blazor. Eles são usados apenas transitoriamente, portanto, o tempo de vida só precisa ser longo o suficiente para que um cliente receba a URL e inicie a navegação nela. No entanto, também deve ser longo o suficiente para permitir a distorção do relógio entre os servidores. O valor padrão é cinco minutos.
No exemplo a seguir, o valor é estendido para sete minutos:
builder.Services.AddRazorComponents(options =>
options.TemporaryRedirectionUrlValidityDuration =
TimeSpan.FromMinutes(7));
Comentários do ASP.NET Core
O ASP.NET Core é um projeto código aberto. Selecione um link para fornecer comentários:
evento
19/11, 23 - 21/11, 23
Participe de sessões on-line no Microsoft Ignite criadas para expandir suas habilidades e ajudá-lo a lidar com os problemas complexos de hoje.
Registe-se agora