Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 do .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Este artigo explica como criar um fornecedor de estado de autenticação personalizado e receber notificações de alteração do estado de autenticação do utilizador em código.
As abordagens gerais adotadas para aplicações do lado do servidor e do lado do cliente Blazor são semelhantes, mas diferem nas suas implementações exatas, pelo que este artigo oscila entre aplicações do lado Blazor do servidor e aplicações do lado Blazor do cliente. Use o seletor de pivô no topo do artigo para alterar o pivô do artigo para corresponder ao tipo de Blazor projeto com que está a trabalhar:
- Aplicações do lado Blazor do servidor (Server pivot): Blazor Server para .NET 7 ou anteriores e o projeto servidor de um Blazor Web App para .NET 8 ou posterior.
- Aplicações do lado Blazor do cliente (Blazor WebAssembly pivot): Blazor WebAssembly para todas as versões do .NET ou projeto
.Clientde um Blazor Web App para .NET 8 ou posterior.
Classe abstrata AuthenticationStateProvider
A Blazor estrutura inclui uma classe abstrata AuthenticationStateProvider para fornecer informações sobre o estado de autenticação do utilizador atual com os seguintes membros:
- GetAuthenticationStateAsync: Obtém assíncronamente o estado de autenticação do utilizador atual.
- AuthenticationStateChanged: Um evento que fornece notificação quando o estado de autenticação mudou. Por exemplo, este evento pode ser ativado se um utilizador iniciar ou sair da aplicação.
- NotifyAuthenticationStateChanged: Despoleta um evento de alteração de estado de autenticação.
Implementar uma implementação personalizada AuthenticationStateProvider
A aplicação deve referenciar o Microsoft.AspNetCore.Components.Authorization pacote NuGet, que fornece suporte de autenticação e autorização para Blazor as aplicações.
Observação
Para obter orientação sobre como adicionar pacotes a aplicativos .NET, consulte os artigos na seção Instalar e gerenciar pacotes em Workflow de utilização de pacotes (documentação do NuGet). Confirme as versões corretas do pacote em NuGet.org.
Configure os seguintes serviços de autenticação, autorização e estado de autenticação em cascata no Program ficheiro.
Quando cria uma Blazor aplicação a partir de um dos Blazor modelos de projeto com autenticação ativada, a aplicação está pré-configurada com os seguintes registos de serviço, o que inclui expor o estado de autenticação como um parâmetro em cascata. Para mais informações, consulte Autenticação e Autorização do ASP.NET Core Blazor com informações adicionais apresentadas na secção Personalizar conteúdo não autorizado com o componente Router.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();
Configure os serviços de autenticação e autorização no Program ficheiro.
Quando cria uma Blazor aplicação a partir de um dos Blazor modelos de projeto com autenticação ativada, a aplicação inclui o seguinte registo de serviço.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorization();
Configurar serviços de autenticação e autorização em Startup.ConfigureServices de Startup.cs.
Quando cria uma Blazor aplicação a partir de um dos Blazor modelos de projeto com autenticação ativada, a aplicação inclui o seguinte registo de serviço.
using Microsoft.AspNetCore.Components.Authorization;
...
services.AddAuthorization();
Em Blazor WebAssembly aplicações (todas versões .NET) ou no .Client projeto de um Blazor Web App (.NET 8 ou posterior), configure serviços de autenticação, autorização e estado de autenticação em cascata no Program ficheiro.
Quando cria uma Blazor aplicação a partir de um dos Blazor modelos de projeto com autenticação ativada, a aplicação está pré-configurada com os seguintes registos de serviço, o que inclui expor o estado de autenticação como um parâmetro em cascata. Para mais informações, consulte Autenticação e Autorização do ASP.NET Core Blazor com informações adicionais apresentadas na secção Personalizar conteúdo não autorizado com o componente Router.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
Configure os serviços de autenticação e autorização no Program ficheiro.
Quando cria uma Blazor aplicação a partir de um dos Blazor modelos de projeto com autenticação ativada, a aplicação inclui o seguinte registo de serviço.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorizationCore();
Subclasse AuthenticationStateProvider e override GetAuthenticationStateAsync para criar o estado de autenticação do utilizador. No exemplo seguinte, todos os utilizadores são autenticados com o nome mrfibulide utilizador .
CustomAuthStateProvider.cs:
using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, "mrfibuli"),
], "Custom Authentication");
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
}
Observação
O código anterior que cria um novo ClaimsIdentity utiliza a inicialização simplificada de coleções introduzida com C# 12 (.NET 8). Para mais informações, veja Coleção expressões - Referência à linguagem C#.
O CustomAuthStateProvider serviço está registado no Program ficheiro. Registe o serviço de âmbito com AddScoped:
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Numa Blazor Server aplicação, regista o serviço com âmbitoAddScopedapós a chamada para AddServerSideBlazor:
builder.Services.AddServerSideBlazor();
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Numa Blazor Server aplicação, regista o serviço com âmbitoAddScopedapós a chamada para AddServerSideBlazor:
services.AddServerSideBlazor();
services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
O CustomAuthStateProvider serviço está registado no Program ficheiro. Registe o serviço singleton com AddSingleton:
builder.Services.AddSingleton<AuthenticationStateProvider, CustomAuthStateProvider>();
Se não estiver presente, adicione uma @using instrução ao _Imports.razor ficheiro para disponibilizar o Microsoft.AspNetCore.Components.Authorization namespace entre os componentes:
@using Microsoft.AspNetCore.Components.Authorization;
Confirme ou altere o componente de vista de rota para a AuthorizeRouteView na Router definição do componente. A localização do Router componente varia consoante o tipo de aplicação. Use a pesquisa para localizar o componente se não souber da sua localização no projeto.
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(Layout.MainLayout)" />
...
</Found>
</Router>
Observação
Quando crias uma Blazor aplicação a partir de um dos Blazor modelos de projeto com autenticação ativada, a aplicação inclui o AuthorizeRouteView componente. Para mais informações, consulte Autenticação e Autorização do ASP.NET Core Blazor com informações adicionais apresentadas na secção Personalizar conteúdo não autorizado com o componente Router.
Onde o Router componente está localizado:
- Confirme ou altere o componente de visualização de rota para um AuthorizeRouteView.
- Confirma ou adiciona o componente CascadingAuthenticationState em torno do componente Router.
A localização do Router componente varia consoante o tipo de aplicação. Use a pesquisa para localizar o componente se não souber da sua localização no projeto.
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
...
</Found>
</Router>
</CascadingAuthenticationState>
Observação
Quando criar uma Blazor aplicação a partir de um dos Blazor modelos de projeto com autenticação ativada, a aplicação inclui os componentes AuthorizeRouteView e CascadingAuthenticationState. Para mais informações, consulte Autenticação e Autorização do ASP.NET Core Blazor com informações adicionais apresentadas na secção Personalizar conteúdo não autorizado com o componente Router.
O seguinte componente de exemplo AuthorizeView demonstra o nome do utilizador autenticado:
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
Para obter orientações sobre o uso de AuthorizeView, consulte ASP.NET Core Blazor autenticação e autorização.
Notificações de alteração de estado de autenticação
Um personalizado AuthenticationStateProvider pode invocar NotifyAuthenticationStateChanged na AuthenticationStateProvider classe base para notificar os consumidores da alteração do estado de autenticação e atualizar a renderização.
O exemplo seguinte baseia-se na implementação de um componente AuthenticationStateProvider personalizado seguindo as orientações na secção Implementar um componente AuthenticationStateProvider personalizado anteriormente neste artigo. Se já seguiu as orientações dessa secção, o seguinte CustomAuthStateProvider substitui o que aparece na secção.
A implementação seguinte CustomAuthStateProvider expõe um método personalizado, AuthenticateUser, para iniciar sessão num utilizador e notificar os consumidores sobre a alteração do estado da autenticação.
CustomAuthStateProvider.cs:
using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity();
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
public void AuthenticateUser(string userIdentifier)
{
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, userIdentifier),
], "Custom Authentication");
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(
Task.FromResult(new AuthenticationState(user)));
}
}
Observação
O código anterior que cria um novo ClaimsIdentity utiliza a inicialização simplificada de coleções introduzida com C# 12 (.NET 8). Para mais informações, veja Coleção expressões - Referência à linguagem C#.
Numa componente:
- Injetar AuthenticationStateProvider.
- Adicione um campo para guardar o identificador do utilizador.
- Adicione um botão e um método para lançar o AuthenticationStateProvider para
CustomAuthStateProvidere chamarAuthenticateUsercom o identificador do utilizador.
@inject AuthenticationStateProvider AuthenticationStateProvider
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
((CustomAuthStateProvider)AuthenticationStateProvider)
.AuthenticateUser(userIdentifier);
}
}
A abordagem anterior pode ser melhorada para desencadear notificações de alterações de estado de autenticação através de um serviço personalizado. A classe seguinte CustomAuthenticationService mantém o principal de reivindicações do utilizador atual num campo de apoio (currentUser) com um evento (UserChanged) ao qual o fornecedor do estado de autenticação pode subscrever, onde o evento invoca NotifyAuthenticationStateChanged. Com a configuração adicional mais adiante nesta secção, o CustomAuthenticationService pode ser injetado num componente com lógica que define o CurrentUser para desencadear o UserChanged evento.
CustomAuthenticationService.cs:
using System.Security.Claims;
public class CustomAuthenticationService
{
public event Action<ClaimsPrincipal>? UserChanged;
private ClaimsPrincipal? currentUser;
public ClaimsPrincipal CurrentUser
{
get { return currentUser ?? new(); }
set
{
currentUser = value;
if (UserChanged is not null)
{
UserChanged(currentUser);
}
}
}
}
No Program ficheiro, registe o CustomAuthenticationService no contentor de injeção de dependências:
builder.Services.AddScoped<CustomAuthenticationService>();
No Startup.ConfigureServices de Startup.cs, registe o CustomAuthenticationService no contentor de injeção de dependências:
services.AddScoped<CustomAuthenticationService>();
No Program ficheiro, registe o CustomAuthenticationService no contentor de injeção de dependências:
builder.Services.AddSingleton<CustomAuthenticationService>();
O seguinte CustomAuthStateProvider subscreve o evento CustomAuthenticationService.UserChanged. O GetAuthenticationStateAsync método devolve o estado de autenticação do utilizador. Inicialmente, o estado de autenticação baseia-se no valor do CustomAuthenticationService.CurrentUser. Quando o utilizador muda, é criado um novo estado de autenticação para o novo utilizador (new AuthenticationState(newUser)) para chamadas para GetAuthenticationStateAsync:
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
private AuthenticationState authenticationState;
public CustomAuthStateProvider(CustomAuthenticationService service)
{
authenticationState = new AuthenticationState(service.CurrentUser);
service.UserChanged += (newUser) =>
{
authenticationState = new AuthenticationState(newUser);
NotifyAuthenticationStateChanged(Task.FromResult(authenticationState));
};
}
public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
Task.FromResult(authenticationState);
}
O método do seguinte componente SignIn cria um principal de reivindicações para o identificador do utilizador definir em CustomAuthenticationService.CurrentUser:
@using System.Security.Claims
@inject CustomAuthenticationService AuthService
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
var currentUser = AuthService.CurrentUser;
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, userIdentifier),
],
"Custom Authentication");
var newUser = new ClaimsPrincipal(identity);
AuthService.CurrentUser = newUser;
}
}
Observação
O código anterior que cria um novo ClaimsIdentity utiliza a inicialização simplificada de coleções introduzida com C# 12 (.NET 8). Para mais informações, veja Coleção expressões - Referência à linguagem C#.
Recursos adicionais
-
Exibição de conteúdo não autorizado do lado do servidor enquanto se pré-renderiza com uma implementação personalizada do
AuthenticationStateProvider -
Como aceder a um
AuthenticationStateProvidera partir de umaDelegatingHandlerconfiguração usando umIHttpClientFactory - Proteja um ASP.NET Core Blazor Web App com OpenID Connect (OIDC)
- Proteja ASP.NET Core Blazor WebAssembly com ASP.NET Core Identity
-
Exibição de conteúdo não autorizado do lado do servidor enquanto se pré-renderiza com uma implementação personalizada do
AuthenticationStateProvider -
Como aceder a um
AuthenticationStateProvidera partir de umaDelegatingHandlerconfiguração usando umIHttpClientFactory - Proteja um ASP.NET Core Blazor Web App com OpenID Connect (OIDC)
- Secure ASP.NET Core Blazor WebAssembly com ASP.NET Core IdentityPrerendering em aplicações alojadas com autenticação Blazor WebAssembly