Partilhar via


Scaffolding do Identity em projetos ASP.NET Core

Por Rick Anderson

scaffolding BlazorIdentity

O scaffolding do Identity ASP.NET Core adiciona o Identity ASP.NET Core a Blazor Web Apps e aplicativos Blazor Server. Depois que o scaffolder adicionar os componentes IdentityRazor ao aplicativo, você poderá personalizar os componentes para atender aos requisitos do seu aplicativo.

Embora o scaffolder gere o código C# necessário para fazer scaffold Identity no aplicativo, você deve atualizar o banco de dados do projeto com uma migração de banco de dados do Entity Framework (EF) Core para concluir o processo. Este artigo explica as etapas necessárias para migrar um banco de dados.

Inspecione as alterações depois de executar o scaffolder do Identity. Recomendamos usar o GitHub ou outro sistema de controle de origem que mostre as alterações de arquivos com um recurso de reversão de alterações.

Os serviços são necessários ao usar autenticação de dois fatores (2FA), confirmação de conta e recuperação de senha e outros recursos de segurança com Identity. Os serviços ou stubs de serviço não são gerados durante o scaffolding do Identity. Os serviços para habilitar esses recursos devem ser adicionados manualmente.

Scaffolding de Páginas Razor e MVC Identity

O ASP.NET Core fornece ASP.NET Core Identity como uma biblioteca de classes Razor (RCL). Os aplicativos que incluem Identity podem aplicar o scaffolder para adicionar seletivamente o código-fonte contido na RCL Identity. Talvez você queira gerar o código-fonte para que você possa modificar o código e alterar o comportamento. Por exemplo, você pode instruir o scaffolder a gerar o código usado no registro. O código Identity personalizado substitui a implementação padrão fornecida pela RCL Identity. Para obter controle total da interface do usuário e não usar o RCL padrão, consulte a seção Criar fonte completa da Identity interface do usuário.

Aplicativos que não incluem autenticação podem aplicar o scaffolder para adicionar o pacote RCL do Identity. Você tem a opção de selecionar o código Identity a ser gerado.

Embora o scaffolder gere a maior parte do código necessário, você precisa atualizar seu projeto para concluir o processo. Este documento explica as etapas necessárias para concluir uma atualização de scaffolding do Identity.

É recomendável usar um sistema de controle do código-fonte que mostre diferenças entre os arquivos e permita que você desfaça as alterações. Inspecione as alterações depois de executar o scaffolder do Identity.

Os serviços são necessários ao usar a Autenticação de Dois Fatores, a Confirmação da conta e recuperação de senha e outros recursos de segurança com o Identity. Os serviços ou stubs de serviço não são gerados durante o scaffolding do Identity. Os serviços para habilitar esses recursos devem ser adicionados manualmente. Por exemplo, confira como Exigir confirmação de email.

Normalmente, os aplicativos criados com contas individuais não devem criar um contexto de dados.

Scaffold Identity em um projeto Blazor

Esta seção se aplica a Blazor Web Apps e aplicativos Blazor Server.

Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Blazor Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar BlazorIdentity:
    • Selecione ou adicione com o botão de adição (+) a classe de contexto de banco de dados (Classe DbContext).
    • Selecione o provedor de banco de dados (Provedor de banco de dados), cujo padrão é o SQL Server.
    • Selecione ou adicione com o botão de adição (+) a classe de usuário (Classe de usuário).
    • Selecione o botão Adicionar.

O código do banco de dados Identity gerado requer EF Core Migrations. As etapas a seguir explicam como criar e aplicar uma migração ao banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Aplicativos Blazor do lado do cliente (Autônomo Blazor WebAssembly)

Os aplicativos Blazor do lado do cliente (Autônomos Blazor WebAssembly) usam suas próprias abordagens de interface do usuário Identity e não podem usar o scaffolding do ASP.NET Core Identity.

Para obter mais informações, consulte a Segurança do Blazor e artigos do Identity.

Fazer scaffold do Identity em um projeto Razor sem autorização existente

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Migrações, UseAuthentication e layout

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Alterações de layout

Opcional: adicione a parcial de logon (_LoginPartial) ao arquivo de layout:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Fazer scaffold do Identity em um projeto Razor com autorização

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Faça scaffold do Identity em um projeto MVC sem autorização existente

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Opcional: adicione a parcial de logon (_LoginPartial) ao arquivo Views/Shared/_Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Adicione MapRazorPages como Program.cs conforme mostrado no código destacado a seguir:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Faça scaffold do Identity em um projeto MVC com autorização

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Criar fonte de interface do usuário do Identity completa

Para manter o controle total da interface do Identity usuário, execute o scaffolder do Identity e selecione Substituir todos os arquivos.

Configuração de senha

Se PasswordOptions estiverem configurados no Startup.ConfigureServices, a configuração do atributo [StringLength] poderá ser necessária para a propriedade Password em páginas do Identity com scaffold. InputModel Password propriedades são encontradas nos seguintes arquivos:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Desabilitar uma página

Esta seção mostra como desativar a página de registro, mas a abordagem pode ser usada para desativar qualquer página.

Para desabilitar o registro de usuário:

  • Scaffold do Identity. Inclua Account.Register, Account.Login e Account.RegisterConfirmation. Por exemplo:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Atualize Areas/Identity/Pages/Account/Register.cshtml.cs para que os usuários não possam se registrar neste ponto de extremidade:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Atualize Areas/Identity/Pages/Account/Register.cshtml para ser consistente com as alterações anteriores:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Comente ou remova o link de registro de Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Atualize a página Areas/Identity/Pages/Account/RegisterConfirmation.

    • Remova o código e os links do arquivo cshtml.
    • Remova o código de confirmação de PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Use outro aplicativo para adicionar usuários

Forneça um mecanismo para adicionar usuários fora do aplicativo Web. As opções para adicionar usuários incluem:

  • Um aplicativo Web de administrador dedicado.
  • Um aplicativo de console.

O código a seguir descreve uma abordagem para adicionar usuários:

  • Uma lista de usuários é lida na memória.
  • Uma senha exclusiva forte é gerada para cada usuário.
  • O usuário é adicionado ao banco de dados do Identity.
  • O usuário é notificado e orientado a alterar a senha.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

O código a seguir descreve como adicionar um usuário:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Uma abordagem semelhante pode ser seguida para cenários de produção.

Impedir a publicação de ativos estáticos do Identity

Para impedir a publicação de ativos estáticos do Identity na raiz da Web, confira a Introdução ao Identity no ASP.NET Core.

O ASP.NET Core fornece ASP.NET Core Identity como uma biblioteca de classes Razor (RCL). Os aplicativos que incluem Identity podem aplicar o scaffolder para adicionar seletivamente o código-fonte contido na RCL Identity. Talvez você queira gerar o código-fonte para que você possa modificar o código e alterar o comportamento. Por exemplo, você pode instruir o scaffolder a gerar o código usado no registro. O código gerado tem precedência sobre o mesmo código na RCL Identity. Para obter controle total da interface do usuário e não usar a RCL padrão, confira a seção Criar fonte de interface do usuário completa do Identity.

Aplicativos que não incluem autenticação podem aplicar o scaffolder para adicionar o pacote RCL do Identity. Você tem a opção de selecionar o código Identity a ser gerado.

Embora o scaffolder gere a maior parte do código necessário, você precisa atualizar seu projeto para concluir o processo. Este documento explica as etapas necessárias para concluir uma atualização de scaffolding do Identity.

É recomendável usar um sistema de controle do código-fonte que mostre diferenças entre os arquivos e permita que você desfaça as alterações. Inspecione as alterações depois de executar o scaffolder do Identity.

Os serviços são necessários ao usar a Autenticação de Dois Fatores, a Confirmação da conta e recuperação de senha e outros recursos de segurança com o Identity. Os serviços ou stubs de serviço não são gerados durante o scaffolding do Identity. Os serviços para habilitar esses recursos devem ser adicionados manualmente. Por exemplo, confira como Exigir confirmação de email.

Normalmente, os aplicativos criados com contas individuais não devem criar um contexto de dados.

Fazer scaffold do Identity em um projeto Razor sem autorização existente

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Migrações, UseAuthentication e layout

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Alterações de layout

Opcional: adicione a parcial de logon (_LoginPartial) ao arquivo de layout:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Fazer scaffold do Identity em um projeto Razor com autorização

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Faça scaffold do Identity em um projeto MVC sem autorização existente

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Opcional: adicione a parcial de logon (_LoginPartial) ao arquivo Views/Shared/_Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Adicione MapRazorPages como Program.cs conforme mostrado no código destacado a seguir:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Faça scaffold do Identity em um projeto MVC com autorização

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Faça scaffolding de Identity em um aplicativo Blazor do servidor com uma autorização

Instale o pacote do NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Observação

Para obter diretrizes sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes no Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas de pacote em NuGet.org.


Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Migrações

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Pontos de extremidade de autenticação de estilo

Como os aplicativos Blazor do servidor usam páginas do Identity do Razor Pages, o estilo da interface do usuário muda quando um visitante navega entre páginas e componentes do Identity. Você tem duas opções para abordar os estilos incongruentes:

Componentes personalizados do Identity

O ASP.NET Core Identity foi projetado para funcionar no contexto da comunicação de solicitação e resposta HTTP, que não é o modelo principal comunicação cliente-servidor em aplicativos Blazor. Os aplicativos ASP.NET Core que usam o ASP.NET Core Identity para gerenciamento de usuários devem usar Razor Pages em vez de componentes Razor para interface do usuário relacionada a Identity, como registro de usuário, logon, logoff e outras tarefas de gerenciamento de usuários.

Como SignInManager<TUser> e UserManager<TUser> não têm suporte em componentes Razor, recomendamos usar a API Web para gerenciar as ações do Identity a partir de componentes Razor por meio de um aplicativo ASP.NET Core habilitado para Identity do lado do servidor. Para obter diretrizes sobre como criar APIs Web para aplicativos Blazor, confira como Chamar uma API Web de um aplicativo ASP.NET Core Blazor.

Uma abordagem para usar componentes Razor para o Identity em vez de páginas Razor é criar seus próprios componentes personalizados do IdentityRazor, mas a Microsoft não recomenda nem dá suporte à abordagem. Para contexto adicional, explore as discussões a seguir. Nas discussões a seguir, exemplos de código em comentários de problemas e exemplos de código com links cruzados em repositórios GitHub não pertencentes à Microsoft não têm suporte da Microsoft, mas podem ser úteis para alguns desenvolvedores:

Para assistência adicional ao tentar criar componentes personalizados do IdentityRazor ou pesquisar componentes Razor de terceiros, recomendamos os seguintes recursos:

Usar um layout personalizado com estilos de aplicativo Blazor

O layout e os estilos das páginas Identity podem ser modificados para produzir páginas que usam estilos semelhantes ao tema Blazor padrão. Essa abordagem não é abordada pela documentação.

Aplicativos Blazor do lado do cliente

Os aplicativos Blazor do lado do cliente usam suas próprias abordagens de interface do usuário do Identity e não podem usar scaffolding do ASP.NET Core Identity. Os aplicativos ASP.NET Core do lado do servidor de soluções Blazor hospedadas podem seguir as diretrizes das Páginas/MVC Razor neste artigo e são configurados como qualquer outro tipo de aplicativo ASP.NET Core que dê suporte ao Identity.

A estruturaBlazor não inclui versões de componente Razorde páginas de interface do usuário Identity. Os componentes Razor de interface do usuário do Identitypodem ser personalizados criados ou obtidos de fontes de terceiros sem suporte.

Para obter mais informações, consulte a Segurança do Blazor e artigos do Identity.

Criar fonte de interface do usuário do Identity completa

Para manter o controle total da interface do Identity usuário, execute o scaffolder do Identity e selecione Substituir todos os arquivos.

Configuração de senha

Se PasswordOptions estiverem configurados no Startup.ConfigureServices, a configuração do atributo [StringLength] poderá ser necessária para a propriedade Password em páginas do Identity com scaffold. InputModel Password propriedades são encontradas nos seguintes arquivos:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Desabilitar uma página

Esta seção mostra como desativar a página de registro, mas a abordagem pode ser usada para desativar qualquer página.

Para desabilitar o registro de usuário:

  • Scaffold do Identity. Inclua Account.Register, Account.Login e Account.RegisterConfirmation. Por exemplo:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Atualize Areas/Identity/Pages/Account/Register.cshtml.cs para que os usuários não possam se registrar neste ponto de extremidade:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Atualize Areas/Identity/Pages/Account/Register.cshtml para ser consistente com as alterações anteriores:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Comente ou remova o link de registro de Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Atualize a página Areas/Identity/Pages/Account/RegisterConfirmation.

    • Remova o código e os links do arquivo cshtml.
    • Remova o código de confirmação de PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Use outro aplicativo para adicionar usuários

Forneça um mecanismo para adicionar usuários fora do aplicativo Web. As opções para adicionar usuários incluem:

  • Um aplicativo Web de administrador dedicado.
  • Um aplicativo de console.

O código a seguir descreve uma abordagem para adicionar usuários:

  • Uma lista de usuários é lida na memória.
  • Uma senha exclusiva forte é gerada para cada usuário.
  • O usuário é adicionado ao banco de dados do Identity.
  • O usuário é notificado e orientado a alterar a senha.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

O código a seguir descreve como adicionar um usuário:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Uma abordagem semelhante pode ser seguida para cenários de produção.

Impedir a publicação de ativos estáticos do Identity

Para impedir a publicação de ativos estáticos do Identity na raiz da Web, confira a Introdução ao Identity no ASP.NET Core.

O ASP.NET Core fornece ASP.NET Core Identity como uma biblioteca de classes Razor (RCL). Os aplicativos que incluem Identity podem aplicar o scaffolder para adicionar seletivamente o código-fonte contido na RCL Identity. Talvez você queira gerar o código-fonte para que você possa modificar o código e alterar o comportamento. Por exemplo, você pode instruir o scaffolder a gerar o código usado no registro. O código gerado tem precedência sobre o mesmo código na RCL Identity. Para obter controle total da interface do usuário e não usar a RCL padrão, confira a seção Criar fonte de interface do usuário completa do Identity.

Aplicativos que não incluem autenticação podem aplicar o scaffolder para adicionar o pacote RCL do Identity. Você tem a opção de selecionar o código Identity a ser gerado.

Embora o scaffolder gere a maior parte do código necessário, você precisa atualizar seu projeto para concluir o processo. Este documento explica as etapas necessárias para concluir uma atualização de scaffolding do Identity.

É recomendável usar um sistema de controle do código-fonte que mostre diferenças entre os arquivos e permita que você desfaça as alterações. Inspecione as alterações depois de executar o scaffolder do Identity.

Os serviços são necessários ao usar a Autenticação de Dois Fatores, a Confirmação da conta e recuperação de senha e outros recursos de segurança com o Identity. Os serviços ou stubs de serviço não são gerados durante o scaffolding do Identity. Os serviços para habilitar esses recursos devem ser adicionados manualmente. Por exemplo, confira como Exigir confirmação de email.

Ao colocar Identity com um novo contexto de dados em um projeto com contas individuais existentes, abra Startup.ConfigureServices e remova as chamadas para:

  • AddDbContext
  • AddDefaultIdentity

Por exemplo, AddDbContext e AddDefaultIdentity são comentados no seguinte código:

public void ConfigureServices(IServiceCollection services)
{
    //services.AddDbContext<ApplicationDbContext>(options =>
    //    options.UseSqlServer(
    //        Configuration.GetConnectionString("DefaultConnection")));
    //services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    //    .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllersWithViews();
    services.AddRazorPages();
}

O código anterior comenta o código duplicado em Areas/Identity/IdentityHostingStartup.cs

Normalmente, os aplicativos criados com contas individuais não devem criar um contexto de dados.

Fazer scaffold do Identity em um projeto vazio

Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Atualize a classe Startup com código semelhante ao seguinte:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts é recomendado, mas não é obrigatório. Para obter mais informações, confira PROTOCOLO HTTP Strict Transport Security Protocol.

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Fazer scaffold do Identity em um projeto Razor sem autorização existente

Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Identity é configurado em Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.

Migrações, UseAuthentication e layout

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Habilitar autenticação

Atualize a classe Startup com código semelhante ao seguinte:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

UseHsts é recomendado, mas não é obrigatório. Para obter mais informações, confira PROTOCOLO HTTP Strict Transport Security Protocol.

Alterações de layout

Opcional: adicione a parcial de logon (_LoginPartial) ao arquivo de layout:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Fazer scaffold do Identity em um projeto Razor com autorização

Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Algumas opções do Identity são configuradas em Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.

Faça scaffold do Identity em um projeto MVC sem autorização existente

Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Opcional: adicione a parcial de logon (_LoginPartial) ao arquivo Views/Shared/_Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Mova o arquivo Pages/Shared/_LoginPartial.cshtml para Views/Shared/_LoginPartial.cshtml.

Identity é configurado em Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Atualize a classe Startup com código semelhante ao seguinte:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts é recomendado, mas não é obrigatório. Para obter mais informações, confira PROTOCOLO HTTP Strict Transport Security Protocol.

Faça scaffold do Identity em um projeto MVC com autorização

Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Faça scaffolding de Identity em um aplicativo Blazor do servidor sem uma autorização existente

Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Identity é configurado em Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.

Migrações

O código do banco de dados Identity gerado requer as Migrações do Entity Framework (EF) Core. Se uma migração para gerar o esquema Identity não tiver sido criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados.

Os Serviços Conectados do Visual Studio são usados para adicionar uma migração EF Core e atualizar o banco de dados.

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione a elipse (...) seguida de Adicionar migração.

Dê à migração um Nome de migração, como CreateIdentitySchema, que é um nome que descreve a migração. Aguarde o carregamento do contexto do banco de dados no campo Nomes de classes DbContext, o que pode levar alguns segundos. Selecione Concluir para criar a migração.

Selecione o botão Fechar após o término da operação.

Selecione novamente a elipse (...) e, em seguida, o comando Atualizar banco de dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

O comando atualizar banco de dados executa as migrações de método Up que não foram aplicadas em um arquivo de código de migração criado pelo scaffolder. Nesse caso, o comando executa o método Up no arquivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs, que cria as tabelas Identity, as restrições e os índices. O espaço reservado {TIME STAMP} é um carimbo de data/hora e o espaço reservado {MIGRATION NAME} é o nome da migração.

Se o esquema do Identity já foi criado, mas não foi aplicado ao banco de dados, somente o comando para atualizar o banco de dados deve ser executado:

No Gerenciador de Soluções, clique duas vezes em Serviços Conectados. Na área SQL Server Express LocalDB de Dependências de Serviços, selecione as reticências (...) seguidas do comando Atualizar o Banco de Dados.

O diálogo Atualizar banco de dados com a migração mais recente será aberto. Aguarde a atualização do campo Nomes de classes DbContext e o carregamento das migrações anteriores, o que pode levar alguns segundos. Selecione o botão Concluir.

Selecione o botão Fechar após o término da operação.

Você pode confirmar a aplicação de um esquema do Identity com o comando a seguir. A saída do comando inclui uma coluna "applied" para mostrar quais migrações são aplicadas ao banco de dados.

No Console do Gerenciador de Pacotes do Visual Studio, execute Get-Migration:

Get-Migration

Se houver mais de um contexto de banco de dados, especifique o contexto com o parâmetro -Context.

Pontos de extremidade de autenticação de estilo

Como os aplicativos Blazor do servidor usam páginas do Identity do Razor Pages, o estilo da interface do usuário muda quando um visitante navega entre páginas e componentes do Identity. Você tem duas opções para abordar os estilos incongruentes:

Componentes personalizados do Identity

Uma abordagem para usar componentes para o Identity em vez de páginas é criar componentes do Identity. Como SignInManager e UserManager não têm suporte em componentes do Razor, use os pontos de extremidade da API Web no aplicativo Blazor para processar ações da conta de usuário.

Usar um layout personalizado com estilos de aplicativo Blazor

O layout e os estilos das páginas Identity podem ser modificados para produzir páginas que usam estilos semelhantes ao tema Blazor padrão. Essa abordagem não é abordada pela documentação.

Faça scaffolding de Identity em um aplicativo Blazor do servidor com uma autorização

Execute o scaffolder do Identity:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto >Adicionar>Novo Item com Scaffold.
  • No painel esquerdo da caixa de diálogo Adicionar Novo Item com Scaffold , selecione Identity. Selecione Identity no painel central. Selecione o botão Adicionar.
  • Na caixa de diálogo Adicionar Identity , selecione as opções desejadas.
    • Se você tiver uma página de layout personalizada existente para Identity (_Layout.cshtml), selecione sua página de layout existente para evitar substituir o layout por uma marcação incorreta feita pelo scaffolder. Por exemplo, selecione:
      • Pages/Shared/_Layout.cshtml para Páginas Razor ou projetos Blazor Server com infraestrutura de Páginas Razor existente.
      • Views/Shared/_Layout.cshtml para projetos MVC ou projetos Blazor Server com infraestrutura MVC existente.
    • Para o contexto de dados (classe DbContext):
      • Selecione sua classe de contexto de dados. Você deve selecionar pelo menos um arquivo para adicionar seu contexto de dados.
      • Para criar um contexto de dados e, possivelmente, criar uma nova classe de usuário para o Identity, selecione o botão +. Aceite o valor padrão ou especifique uma classe (por exemplo, Contoso.Data.ApplicationDbContext para uma empresa chamada "Contoso"). Para criar uma nova classe de usuário, selecione o botão + para Classe de usuário e especifique a classe (por exemplo, ContosoUser para uma empresa chamada "Contoso").
    • Selecione o botão Adicionar para executar o scaffolder.

Algumas opções do Identity são configuradas em Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.

Aplicativos Blazor do lado do cliente

Os aplicativos Blazor do lado do cliente usam suas próprias abordagens de interface do usuário do Identity e não podem usar scaffolding do ASP.NET Core Identity. Os aplicativos ASP.NET Core do lado do servidor de soluções Blazor hospedadas podem seguir as diretrizes das Páginas/MVC Razor neste artigo e são configurados como qualquer outro tipo de aplicativo ASP.NET Core que dê suporte ao Identity.

A estruturaBlazor não inclui versões de componente Razorde páginas de interface do usuário Identity. Os componentes Razor de interface do usuário do Identitypodem ser personalizados criados ou obtidos de fontes de terceiros sem suporte.

Para obter mais informações, consulte a Segurança do Blazor e artigos do Identity.

Criar fonte de interface do usuário do Identity completa

Para manter o controle total da interface do Identity usuário, execute o scaffolder do Identity e selecione Substituir todos os arquivos.

O código destacado a seguir mostra as alterações para substituir a interface do usuário padrão do Identity por Identity em um aplicativo Web ASP.NET Core 2.1. Talvez você queira fazer isso para ter controle total da interface do usuário do Identity.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

O padrão do Identity é substituído no seguinte código:

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

O código a seguir define LoginPath, LogoutPath e AccessDeniedPath):

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

Registre uma implementação IEmailSender, por exemplo:

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

Configuração de senha

Se PasswordOptions estiverem configurados no Startup.ConfigureServices, a configuração do atributo [StringLength] poderá ser necessária para a propriedade Password em páginas do Identity com scaffold. InputModel Password propriedades são encontradas nos seguintes arquivos:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Desabilitar uma página

Esta seção mostra como desativar a página de registro, mas a abordagem pode ser usada para desativar qualquer página.

Para desabilitar o registro de usuário:

  • Scaffold do Identity. Inclua Account.Register, Account.Login e Account.RegisterConfirmation. Por exemplo:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Atualize Areas/Identity/Pages/Account/Register.cshtml.cs para que os usuários não possam se registrar neste ponto de extremidade:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Atualize Areas/Identity/Pages/Account/Register.cshtml para ser consistente com as alterações anteriores:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Comente ou remova o link de registro de Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Atualize a página Areas/Identity/Pages/Account/RegisterConfirmation.

    • Remova o código e os links do arquivo cshtml.
    • Remova o código de confirmação de PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Use outro aplicativo para adicionar usuários

Forneça um mecanismo para adicionar usuários fora do aplicativo Web. As opções para adicionar usuários incluem:

  • Um aplicativo Web de administrador dedicado.
  • Um aplicativo de console.

O código a seguir descreve uma abordagem para adicionar usuários:

  • Uma lista de usuários é lida na memória.
  • Uma senha exclusiva forte é gerada para cada usuário.
  • O usuário é adicionado ao banco de dados do Identity.
  • O usuário é notificado e orientado a alterar a senha.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

O código a seguir descreve como adicionar um usuário:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Uma abordagem semelhante pode ser seguida para cenários de produção.

Impedir a publicação de ativos estáticos do Identity

Para impedir a publicação de ativos estáticos do Identity na raiz da Web, confira a Introdução ao Identity no ASP.NET Core.

Recursos adicionais

Alterações no código de autenticação para ASP.NET Core 2.1 e posterior