Exercício – configurar o Suporte de Identidade

Concluído

A Identidade está pronta a utilizar sem qualquer personalização. Nesta unidade, a Identidade é adicionada a um projeto existente ASP.NET Core Razor Pages.

Obter e abrir o projeto inicial

Nota

Se quiser utilizar o .devcontainer no GitHub Codespaces, navegue para os seus codespaces para o repositório MicrosoftDocs/mslearn-secure-aspnet-core-identity . Crie um novo espaço de código com o main ramo e, em seguida, avance para o passo 3.

  1. Numa janela de terminal, execute o seguinte comando para obter o projeto inicial:

    git clone https://github.com/MicrosoftDocs/mslearn-secure-aspnet-core-identity
    
  2. Mude para o diretório de código fonte e inicie o Visual Studio Code:

    cd mslearn-secure-aspnet-core-identity
    code .
    

    O Visual Studio Code é aberto. Aceite quaisquer pedidos para instalar extensões recomendadas ou selecione Reabrir no Contentor se pretender utilizar o .devcontainer.

    Dica

    Se perder o pedido para reabrir no contentor, prima Ctrl+Shift+P para abrir a paleta de comandos e, em seguida, procure e selecione Contentores de Programador: Reabrir no Contentor.

  3. Depois de o projeto ser carregado (localmente ou no contentor), prima Ctrl+Shift+` para abrir um novo painel de terminal.

  4. No novo painel de terminal, defina a sua localização para o diretório RazorPagesPizza :

    cd RazorPagesPizza
    
  5. No painel Explorador , expanda o diretório RazorPagesPizza para ver o código. RazorPagesPizza é o diretório do projeto. À medida que avança, suponha que todos os caminhos abordados neste módulo são relativos a esta localização.

Explorar a aplicação

Vamos executar a aplicação para obter uma introdução rápida.

  1. No painel de terminal, crie o projeto e execute a aplicação:

    dotnet run
    
  2. Repare no URL apresentado na saída do terminal. Por exemplo, https://localhost:7192.

  3. Abra a aplicação no browser ao selecionar o URL com Ctrl+clique.

    Importante

    Se estiver a utilizar o .devcontainer no Docker, o certificado SSL do interior do contentor não será considerado fidedigno pelo browser. Para ver a aplicação Web, tem de efetuar um dos seguintes procedimentos:

    • Ignore o erro de certificado. Se utilizar o Microsoft Edge, selecione Avançadas e Continuar para localhost (não recomendado). Os detalhes variam consoante o browser.
    • Guarde o certificado e adicione-o às autoridades de certificação fidedignas.
    • Importe um certificado de desenvolvimento existente dentro do contentor. Para obter mais informações, veja os comentários gerados em ./devcontainer/devcontainter.json.

    Se optar por importar um certificado de desenvolvimento existente dentro do contentor, o caminho do contentor /root/.aspnet/ é exposto como .devcontainer/persisted-data/.aspnet fora do contentor. Isto é para sua comodidade.

    Se estiver a utilizar o .devcontainer no GitHub Codespaces, não é necessária nenhuma ação. O Codespaces processa automaticamente a ligação SSL do proxy.

  4. Explore a aplicação Web no browser. Utilizar as ligações no cabeçalho:

    1. Navegar para a Lista de Pizzas
    2. Navegar de volta para Casa

    Repare que não é necessário autenticar.

  5. Prima Ctrl+C no painel de terminal para parar a aplicação.

Adicionar ASP.NET Core Identidade ao projeto

A implementação de Identidade predefinida pode ser adicionada com dotnet ferramentas de linha de comandos.

  1. Instale o estruturador de código ASP.NET Core:

    dotnet tool install dotnet-aspnet-codegenerator --version 6.0.2 --global
    

    O estruturador é uma ferramenta .NET Core que:

    • É utilizado para adicionar os componentes de Identidade predefinidos ao projeto.
    • Ativa a personalização de componentes da IU de Identidade na próxima unidade.
    • É invocado através dotnet aspnet-codegenerator deste módulo.
  2. Adicione os seguintes pacotes NuGet ao projeto:

    dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 6.0.2
    dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore --version 6.0.3
    dotnet add package Microsoft.AspNetCore.Identity.UI --version 6.0.3
    dotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0.3
    dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 6.0.3
    

    Os pacotes instalam dependências e modelos de geração de código que são utilizados pelo estruturador.

    Dica

    Para ver os geradores disponíveis:

    • Na shell de comandos, execute dotnet aspnet-codegenerator -h.
    • No Visual Studio, clique com o botão direito do rato no projeto em Solution Explorer (Explorador de Soluções) e selecione Add (Adicionar) >New Scaffolded Item (Novo Item Estruturado).
  3. Utilize o estruturador para adicionar os componentes de Identidade predefinidos ao projeto. Execute o seguinte comando no terminal:

    dotnet aspnet-codegenerator identity --useDefaultUI --dbContext RazorPagesPizzaAuth
    

    No comando anterior:

    • O gerador identificado como identity é utilizado para adicionar a arquitetura de Identidade ao projeto.
    • A --useDefaultUI opção indica que é utilizada uma biblioteca de classes do Razor (RCL) que contém os elementos de IU predefinidos. O bootstrap é utilizado para modelar os componentes.
    • A --dbContext opção especifica o nome de uma classe de contexto de base de dados EF Core a gerar.

    A seguinte Areas estrutura de diretório é apresentada no diretório RazorPagesPizza :

    • Areas
      • Identity (é apresentado na mesma linha que Áreas)
        • Data
          • RazorPagesPizzaAuth.cs
        • Pages
          • _ValidationScriptsPartial.cshtml
          • _ViewStart.cshtml

    Dica

    Se o Areas diretório não aparecer automaticamente no painel Explorador, selecione o botão Atualizar Explorador no cabeçalho MSLEARN-SECURE-ASPNET-CORE-IDENTITY no painel Explorador .

    As áreas fornecem uma forma de criar partições de uma aplicação Web ASP.NET Core em grupos funcionais mais pequenos.

    O estruturador também fez as seguintes alterações realçadas em Program.cs, reformatados para legibilidade:

    using Microsoft.AspNetCore.Identity;
    using Microsoft.EntityFrameworkCore;
    using RazorPagesPizza.Areas.Identity.Data;
    var builder = WebApplication.CreateBuilder(args);
    var connectionString = builder.Configuration.GetConnectionString("RazorPagesPizzaAuthConnection"); 
    builder.Services.AddDbContext<RazorPagesPizzaAuth>(options => options.UseSqlServer(connectionString)); 
    builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
          .AddEntityFrameworkStores<RazorPagesPizzaAuth>();
          
    // Add services to the container.
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();
    
    app.MapRazorPages();
    
    app.Run();
    

    No código anterior:

    • A RazorPagesPizzaAuthConnection cadeia de ligação é lida a partir de appsettings.json.
    • A classe de contexto da base de dados EF Core, denominada RazorPagesPizzaAuth, está configurada com a cadeia de ligação.
    • Os serviços de Identidade são registados, incluindo a IU predefinida, fornecedores de tokens e autenticação baseada em cookies.
      • .AddDefaultIdentity<IdentityUser> indica aos Serviços de identidade para utilizarem o modelo de utilizador predefinido.
      • A expressão options => options.SignIn.RequireConfirmedAccount = true lambda especifica que os utilizadores têm de confirmar as respetivas contas de e-mail.
      • .AddEntityFrameworkStores<RazorPagesPizzaAuth>() especifica que a Identidade utiliza o arquivo Entity Framework Core predefinido para a respetiva base de dados. A RazorPagesPizzaAuthDbContext classe é utilizada.
    • app.UseAuthentication(); ativa as capacidades de autenticação. Mais especificamente, uma instância do middleware de autenticação do ASP.NET Core é adicionada ao pipeline de processamento de pedidos HTTP da aplicação.

Configurar a ligação à base de dados

A ConnectionStrings secção em appsettings.json deve ter um aspeto semelhante ao seguinte JSON:

"ConnectionStrings": {
    "RazorPagesPizzaAuthConnection": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesPizza;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Esta cadeia de ligação aponta para uma instância do SQL Server Express LocalDB por predefinição. Se estiver a utilizar o .devcontainer, tem de alterar a cadeia de ligação da seguinte forma! Guarde as alterações.

"ConnectionStrings": {
    "RazorPagesPizzaAuthConnection": "Data Source=localhost;Initial Catalog=RazorPagesPizza;Integrated Security=False;User Id=sa;Password=P@ssw0rd;MultipleActiveResultSets=True"
}

Esta ação atualiza a cadeia de ligação para ligar à instância de SQL Server dentro do contentor.

Atualizar a base de dados

Agora que já verificou a cadeia de ligação, pode gerar e executar uma migração para criar a base de dados.

  1. Execute o seguinte comando para criar a aplicação:

    dotnet build
    

    A compilação tem êxito sem avisos. Se a compilação falhar, verifique o resultado para obter informações para resolução de problemas.

  2. Instale a ferramenta de migração Entity Framework Core:

    dotnet tool install dotnet-ef --version 6.0.3 --global
    

    A ferramenta de migração é uma ferramenta .NET que:

    • Gera código denominado migração para criar e atualizar a base de dados que suporta o modelo de entidade Identidade.
    • Executa migrações numa base de dados existente.
    • É invocado através dotnet ef deste módulo.
  3. Crie e execute uma migração EF Core para atualizar a base de dados:

    dotnet ef migrations add CreateIdentitySchema
    dotnet ef database update
    

    A migração EF Core CreateIdentitySchema aplicou um script de alterações de linguagem DDL (Data Definition Language) para criar as tabelas de suporte à Identidade. Por exemplo, o seguinte resultado ilustra uma CREATE TABLE instrução gerada pela migração:

    info: Microsoft.EntityFrameworkCore.Database.Command[20101]
          Executed DbCommand (98ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
          CREATE TABLE [AspNetUsers] (
              [Id] nvarchar(450) NOT NULL,
              [UserName] nvarchar(256) NULL,
              [NormalizedUserName] nvarchar(256) NULL,
              [Email] nvarchar(256) NULL,
              [NormalizedEmail] nvarchar(256) NULL,
              [EmailConfirmed] bit NOT NULL,
              [PasswordHash] nvarchar(max) NULL,
              [SecurityStamp] nvarchar(max) NULL,
              [ConcurrencyStamp] nvarchar(max) NULL,
              [PhoneNumber] nvarchar(max) NULL,
              [PhoneNumberConfirmed] bit NOT NULL,
              [TwoFactorEnabled] bit NOT NULL,
              [LockoutEnd] datetimeoffset NULL,
              [LockoutEnabled] bit NOT NULL,
              [AccessFailedCount] int NOT NULL,
              CONSTRAINT [PK_AspNetUsers] PRIMARY KEY ([Id])
          );
    

    Dica

    ef O comando deu um erro sobre o LocalDb não ser suportado? Certifique-se de que definiu a cadeia de ligação, conforme descrito na secção "Configurar a ligação da base de dados"!

  4. A extensão SQL Server foi adicionada ao Visual Studio Code, se necessário, quando aceitou as extensões recomendadas. Prima Ctrl+Alt+D para mudar para o painel SQL Server.

  5. Expanda os nós sob a ligação de base de dados existente. Expanda o nó Bases de Dados , o nó RazorPagesPizza e, por fim, o nó Tabelas . Anote a lista de tabelas. Isto confirma que a migração foi esclarada com êxito.

    A base de dados do RazorPagesPizza com as tabelas criadas recentemente.

    Nota

    A imagem anterior mostra um exemplo com SQL Server Express LocalDB. Ao utilizar o .devcontainer, a ligação é denominada mssql-container.

Navegue de volta para o painel Explorador . Em Pages/Shared/_Layout.cshtml, substitua o comentário @* Add the _LoginPartial partial view *@ pelo seguinte.

<partial name="_LoginPartial" />

A markup anterior compõe a vista parcial _LoginPartial no cabeçalho de páginas que utilizem o esquema predefinido. _LoginPartial foi adicionado pela estrutura de Identidade. Esta vista parcial confere ao utilizador ligações para Iniciar sessão e Registar se o utilizador não tiver sessão iniciada.

Testar a funcionalidade Identidade

É tudo o que é necessário para adicionar a implementação de Identidade predefinida. Está na hora de testá-lo!

  1. Certifique-se de que guardou todas as suas alterações.

  2. No painel de terminal, crie o projeto e execute a aplicação:

    dotnet run
    
  3. Navegue para a aplicação no seu browser como anteriormente.

  4. Selecione a ligação Registar no cabeçalho da aplicação. Preencha o formulário para criar uma nova conta.

    A página Registar confirmação é apresentada. Uma vez que a aplicação ainda não foi configurada para enviar e-mails de confirmação, a ligação de confirmação é fornecida nesta página.

  5. Selecione a ligação de confirmação. É apresentada uma mensagem de confirmação.

  6. Selecione a ligação Iniciar sessão no cabeçalho da aplicação e inicie sessão.

    Após um início de sessão bem-sucedido:

    • Será redirecionado para a home page.
    • O cabeçalho da aplicação apresenta Hello [endereço de e-mail]! e uma ligação Terminar sessão .
    • Um cookie com o nome .AspNetCore.Identity.Application é criado. A identidade preserva sessões de utilizadores com autenticação baseada em cookies.
  7. Selecione a ligação Terminar sessão no cabeçalho da aplicação.

    Após terminar sessão com êxito, o cookie .AspNetCore.Identity.Application é eliminado para terminar a sessão do utilizador.

  8. Prima Ctrl+C no painel de terminal para parar a aplicação.

Resumo

Nesta unidade, adicionou a implementação de Identidade predefinida a uma aplicação Web existente. Na próxima unidade, irá aprender a expandir e personalizar a Identidade.