Scaffolding do Identity em projetos ASP.NET Core

De Rick Anderson

O ASP.NET Core fornece o ASP.NET Core Identity como uma RazorBiblioteca de Classes. Aplicativos que incluem Identity podem aplicar o scaffolder do Identity para adicionar seletivamente o código-fonte contido na RCL (Biblioteca de Classes do Razor). 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 que foram criados com contas individuais não devem criar um novo contexto de dados.

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

Instale o pacote 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 de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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 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 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 de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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 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.

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 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 estrutura Blazor usa Razor versões de componente (.razor) de páginas de interface do usuário Identity (.cshtml) ao fazer scaffolding de Identity em um aplicativo Web Blazor.

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. Propriedades InputModelPassword 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 o ASP.NET Core Identity como uma RazorBiblioteca de Classes. Aplicativos que incluem Identity podem aplicar o scaffolder do Identity para adicionar seletivamente o código-fonte contido na RCL (Biblioteca de Classes do Razor). 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 que foram criados com contas individuais não devem criar um novo contexto de dados.

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

Instale o pacote 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 de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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 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 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 de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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 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 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 de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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. Propriedades InputModelPassword 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 o ASP.NET Core Identity como uma RazorBiblioteca de Classes. Aplicativos que incluem Identity podem aplicar o scaffolder do Identity para adicionar seletivamente o código-fonte contido na RCL (Biblioteca de Classes do Razor). 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 fazer scaffolding do Identity com um novo contexto de dados em um projeto com contas individuais existentes:

  • No Startup.ConfigureServices, 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 que foram criados com contas individuais não devem criar um novo 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 de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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 de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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>
  • Mover o arquivo Pages/Shared/_LoginPartial.cshtml para Views/Shared/_LoginPartial.cshtml

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

O código de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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 de banco de dados do Identity que foi gerado requer Migrações principais do Entity Framework Core. Se uma migração para criar o esquema do Identity não foi criada e aplicada ao banco de dados, crie uma migração e atualize o banco de dados. Por exemplo, execute os seguintes comandos:

No Console do Gerenciador de Pacotes do Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CriarIdentityEsquema" para o comando Add-Migration é arbitrário. "CreateIdentitySchema" descreve a 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 Console do Gerenciador de Pacotes do Visual Studio, execute Update-Database:

Update-Database

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. Propriedades InputModelPassword 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