Identidade Scaffold em projetos ASP.NET CoreScaffold Identity in ASP.NET Core projects

Por Rick AndersonBy Rick Anderson

ASP.NET Core 2,1 e posterior fornece ASP.NET Core identidade como uma biblioteca de classes Razor.ASP.NET Core 2.1 and later provides ASP.NET Core Identity as a Razor Class Library. Os aplicativos que incluem identidade podem aplicar o scaffolder para adicionar seletivamente o código-fonte contido na biblioteca de classes do Razor de identidade (RCL).Applications that include Identity can apply the scaffolder to selectively add the source code contained in the Identity Razor Class Library (RCL). Talvez você queira gerar o código-fonte para que você possa modificar o código e alterar o comportamento.You might want to generate source code so you can modify the code and change the behavior. Por exemplo, você pode instruir o scaffolder a gerar o código usado no registro.For example, you could instruct the scaffolder to generate the code used in registration. Código gerado tem precedência sobre o mesmo código na RCL de Identidade.Generated code takes precedence over the same code in the Identity RCL. Para obter controle total da interface do usuário e não usar o RCL padrão, consulte a seção criar origem da interface do usuário de identidade completa.To gain full control of the UI and not use the default RCL, see the section Create full identity UI source.

Os aplicativos que não incluem autenticação podem aplicar o scaffolder para adicionar o pacote de identidade RCL.Applications that do not include authentication can apply the scaffolder to add the RCL Identity package. Você tem a opção de selecionar o código de Identidade a ser gerado.You have the option of selecting Identity code to be generated.

Embora o scaffolder gere a maior parte do código necessário, você precisará atualizar seu projeto para concluir o processo.Although the scaffolder generates most of the necessary code, you'll have to update your project to complete the process. Este documento explica as etapas necessárias para concluir uma atualização de scaffolding de identidade.This document explains the steps needed to complete an Identity scaffolding update.

Quando a identidade scaffolder é executada, um arquivo ScaffoldingReadme. txt é criado no diretório do projeto.When the Identity scaffolder is run, a ScaffoldingReadme.txt file is created in the project directory. O arquivo ScaffoldingReadme. txt contém instruções gerais sobre o que é necessário para concluir a atualização do Identity scaffolding.The ScaffoldingReadme.txt file contains general instructions on what's needed to complete the Identity scaffolding update. Este documento contém instruções mais completas do que o arquivo ScaffoldingReadme. txt .This document contains more complete instructions than the ScaffoldingReadme.txt file.

É recomendável usar um sistema de controle do código-fonte que mostra diferenças de arquivo e permite que você faça o logout das alterações.We recommend using a source control system that shows file differences and allows you to back out of changes. Inspecione as alterações depois de executar a identidade scaffolder.Inspect the changes after running the Identity scaffolder.

Observação

Os serviços são necessários ao usar a autenticação de dois fatores, confirmação de conta e recuperação de senhae outros recursos de segurança com identidade.Services are required when using Two Factor Authentication, Account confirmation and password recovery, and other security features with Identity. Serviços ou stubs de serviço não são gerados quando a identidade scaffolding.Services or service stubs aren't generated when scaffolding Identity. Os serviços para habilitar esses recursos devem ser adicionados manualmente.Services to enable these features must be added manually. Por exemplo, consulte exigir confirmação de email.For example, see Require Email Confirmation.

Scaffold identidade em um projeto vazioScaffold identity into an empty project

Execute o scaffolder de identidade:Run the Identity scaffolder:

  • Partir Gerenciador de soluções, clique com botão direito no projeto > Add > New Scaffolded Item.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • No painel à esquerda do adicionar Scaffold caixa de diálogo, selecione identidade > adicionar.From the left pane of the Add Scaffold dialog, select Identity > ADD.
  • Na caixa de diálogo Adicionar identidade , selecione as opções desejadas.In the ADD Identity dialog, select the options you want.
    • Selecione a página de layout existente ou o arquivo de layout será substituído por marcação incorreta.Select your existing layout page, or your layout file will be overwritten with incorrect markup. Por exemplo ~/Pages/Shared/_Layout.cshtml , para ~/Views/Shared/_Layout.cshtml Razor Pages para projetos MVCFor example ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/Views/Shared/_Layout.cshtml for MVC projects
    • Selecione o + botão para criar um novo classe de contexto de dados.Select the + button to create a new Data context class.
  • Selecione adicionar.Select ADD.

Adicione as seguintes chamadas realçadas à classe Startup:Add the following highlighted calls to the Startup class:

public class Startup
{        
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvc();
    }
}

UseHsts é recomendável, mas não é necessário.UseHsts is recommended but not required. Ver protocolo de segurança de transporte estrito HTTP para obter mais informações.See HTTP Strict Transport Security Protocol for more information.

O código do banco de dados de identidade gerado requer migrações Entity Framework Core.The generated Identity database code requires Entity Framework Core Migrations. Criar uma migração e atualizar o banco de dados.Create a migration and update the database. Por exemplo, execute os seguintes comandos:For example, run the following commands:

No Visual Studio Package Manager Console:In the Visual Studio Package Manager Console:

Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CreateIdentitySchema" para Add-Migration o comando é arbitrário.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema"Descreve a migração."CreateIdentitySchema" describes the migration.

Scaffold identidade em um projeto Razor sem autorização existenteScaffold identity into a Razor project without existing authorization

Execute o scaffolder de identidade:Run the Identity scaffolder:

  • Partir Gerenciador de soluções, clique com botão direito no projeto > Add > New Scaffolded Item.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • No painel à esquerda do adicionar Scaffold caixa de diálogo, selecione identidade > adicionar.From the left pane of the Add Scaffold dialog, select Identity > ADD.
  • Na caixa de diálogo Adicionar identidade , selecione as opções desejadas.In the ADD Identity dialog, select the options you want.
    • Selecione a página de layout existente ou o arquivo de layout será substituído por marcação incorreta.Select your existing layout page, or your layout file will be overwritten with incorrect markup. Por exemplo ~/Pages/Shared/_Layout.cshtml , para ~/Views/Shared/_Layout.cshtml Razor Pages para projetos MVCFor example ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/Views/Shared/_Layout.cshtml for MVC projects
    • Selecione o + botão para criar um novo classe de contexto de dados.Select the + button to create a new Data context class.
  • Selecione adicionar.Select ADD.

A identidade é configurada em áreas/identidade/IdentityHostingStartup. cs.Identity is configured in Areas/Identity/IdentityHostingStartup.cs. para obter mais informações, consulte IHostingStartup.for more information, see IHostingStartup.

Migrações, UseAuthentication e layoutMigrations, UseAuthentication, and layout

O código do banco de dados de identidade gerado requer migrações Entity Framework Core.The generated Identity database code requires Entity Framework Core Migrations. Criar uma migração e atualizar o banco de dados.Create a migration and update the database. Por exemplo, execute os seguintes comandos:For example, run the following commands:

No Visual Studio Package Manager Console:In the Visual Studio Package Manager Console:

Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CreateIdentitySchema" para Add-Migration o comando é arbitrário.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema"Descreve a migração."CreateIdentitySchema" describes the migration.

Habilitar autenticaçãoEnable authentication

No método Configure da classe Startup, chame UseAuthentication após UseStaticFiles:In the Configure method of the Startup class, call UseAuthentication after UseStaticFiles:

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

    public IConfiguration Configuration { get; }

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

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

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

        app.UseMvc();
    }
}

UseHsts é recomendável, mas não é necessário.UseHsts is recommended but not required. Ver protocolo de segurança de transporte estrito HTTP para obter mais informações.See HTTP Strict Transport Security Protocol for more information.

Alterações de layoutLayout changes

Opcional: Adicione o logon parcial (_LoginPartial) ao arquivo de layout:Optional: Add the login partial (_LoginPartial) to the layout file:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - RazorNoAuth8</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-page="/Index" class="navbar-brand">RazorNoAuth8</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-page="/Index">Home</a></li>
                    <li><a asp-page="/About">About</a></li>
                    <li><a asp-page="/Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - RazorNoAuth8</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

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

Scaffold identidade em um projeto Razor com autorizaçãoScaffold identity into a Razor project with authorization

Execute o scaffolder de identidade:Run the Identity scaffolder:

  • Em Gerenciador de soluções, clique com o botão direito do mouse no projeto > Adicionar > novo item com Scaffold.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • No painel esquerdo da caixa de diálogo Adicionar Scaffold , selecione identidade > Adicionar.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Na caixa de diálogo Adicionar identidade , selecione as opções desejadas.In the Add Identity dialog, select the options you want.
    • Selecione a página de layout existente ou o arquivo de layout será substituído por marcação incorreta.Select your existing layout page, or your layout file will be overwritten with incorrect markup. Quando um arquivo layout. cshtml de_ existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten.

Por exemplo: ~/Pages/Shared/_Layout.cshtml para Razor Pages ~/Views/Shared/_Layout.cshtml para projetos MVCFor example: ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/Views/Shared/_Layout.cshtml for MVC projects

  • Para usar o contexto de dados existente, selecione pelo menos um arquivo para substituir.To use your existing data context, select at least one file to override. Você deve selecionar pelo menos um arquivo para adicionar o contexto de dados.You must select at least one file to add your data context.
    • Selecione sua classe de contexto de dados.Select your data context class.
    • Selecione Adicionar.Select Add.
  • Para criar um novo contexto de usuário e possivelmente criar uma classe de usuário personalizada para identidade:To create a new user context and possibly create a custom user class for Identity:
    • Selecione o botão + para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class.
    • Selecione Adicionar.Select Add.

Observação: se você estiver criando um novo contexto de usuário, não precisará selecionar um arquivo para substituir.Note: If you're creating a new user context, you don't have to select a file to override.

Algumas opções de identidade são configuradas em áreas/identidade/IdentityHostingStartup. cs.Some Identity options are configured in Areas/Identity/IdentityHostingStartup.cs. para obter mais informações, consulte IHostingStartup.For more information, see IHostingStartup.

Scaffold identidade em um projeto MVC sem autorização existenteScaffold identity into an MVC project without existing authorization

Execute o scaffolder de identidade:Run the Identity scaffolder:

  • Partir Gerenciador de soluções, clique com botão direito no projeto > Add > New Scaffolded Item.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • No painel à esquerda do adicionar Scaffold caixa de diálogo, selecione identidade > adicionar.From the left pane of the Add Scaffold dialog, select Identity > ADD.
  • Na caixa de diálogo Adicionar identidade , selecione as opções desejadas.In the ADD Identity dialog, select the options you want.
    • Selecione a página de layout existente ou o arquivo de layout será substituído por marcação incorreta.Select your existing layout page, or your layout file will be overwritten with incorrect markup. Por exemplo ~/Pages/Shared/_Layout.cshtml , para ~/Views/Shared/_Layout.cshtml Razor Pages para projetos MVCFor example ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/Views/Shared/_Layout.cshtml for MVC projects
    • Selecione o + botão para criar um novo classe de contexto de dados.Select the + button to create a new Data context class.
  • Selecione adicionar.Select ADD.

Opcional: Adicione o logon Partial (_LoginPartial) ao arquivo views/Shared/_ layout. cshtml :Optional: Add the login partial (_LoginPartial) to the Views/Shared/_Layout.cshtml file:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - MvcNoAuth3</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">MvcNoAuth3</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - MvcNoAuth3</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>
  • Mova o arquivo pages/Shared/_LoginPartial. cshtml para views/Shared/_LoginPartial. cshtmlMove the Pages/Shared/_LoginPartial.cshtml file to Views/Shared/_LoginPartial.cshtml

A identidade é configurada em áreas/identidade/IdentityHostingStartup. cs.Identity is configured in Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.For more information, see IHostingStartup.

O código do banco de dados de identidade gerado requer migrações Entity Framework Core.The generated Identity database code requires Entity Framework Core Migrations. Criar uma migração e atualizar o banco de dados.Create a migration and update the database. Por exemplo, execute os seguintes comandos:For example, run the following commands:

No Visual Studio Package Manager Console:In the Visual Studio Package Manager Console:

Add-Migration CreateIdentitySchema
Update-Database

O parâmetro de nome "CreateIdentitySchema" para Add-Migration o comando é arbitrário.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema"Descreve a migração."CreateIdentitySchema" describes the migration.

Chamar UseAuthentication após UseStaticFiles:Call UseAuthentication after UseStaticFiles:

public class Startup
{

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

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

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvcWithDefaultRoute();
    }
}

UseHsts é recomendável, mas não é necessário.UseHsts is recommended but not required. Ver protocolo de segurança de transporte estrito HTTP para obter mais informações.See HTTP Strict Transport Security Protocol for more information.

Scaffold identidade em um projeto MVC com autorizaçãoScaffold identity into an MVC project with authorization

Execute o scaffolder de identidade:Run the Identity scaffolder:

  • Em Gerenciador de soluções, clique com o botão direito do mouse no projeto > Adicionar > novo item com Scaffold.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • No painel esquerdo da caixa de diálogo Adicionar Scaffold , selecione identidade > Adicionar.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Na caixa de diálogo Adicionar identidade , selecione as opções desejadas.In the Add Identity dialog, select the options you want.
    • Selecione a página de layout existente ou o arquivo de layout será substituído por marcação incorreta.Select your existing layout page, or your layout file will be overwritten with incorrect markup. Quando um arquivo layout. cshtml de_ existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten.

Por exemplo: ~/Pages/Shared/_Layout.cshtml para Razor Pages ~/Views/Shared/_Layout.cshtml para projetos MVCFor example: ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/Views/Shared/_Layout.cshtml for MVC projects

  • Para usar o contexto de dados existente, selecione pelo menos um arquivo para substituir.To use your existing data context, select at least one file to override. Você deve selecionar pelo menos um arquivo para adicionar o contexto de dados.You must select at least one file to add your data context.
    • Selecione sua classe de contexto de dados.Select your data context class.
    • Selecione Adicionar.Select Add.
  • Para criar um novo contexto de usuário e possivelmente criar uma classe de usuário personalizada para identidade:To create a new user context and possibly create a custom user class for Identity:
    • Selecione o botão + para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class.
    • Selecione Adicionar.Select Add.

Observação: se você estiver criando um novo contexto de usuário, não precisará selecionar um arquivo para substituir.Note: If you're creating a new user context, you don't have to select a file to override.

Exclua as páginas/pasta compartilhada e os arquivos nessa pasta.Delete the Pages/Shared folder and the files in that folder.

Criar origem da interface do usuário de identidade completaCreate full identity UI source

Para manter o controle total da interface do usuário de identidade, execute a identidade scaffolder e selecione substituir todos os arquivos.To maintain full control of the Identity UI, run the Identity scaffolder and select Override all files.

O código realçado a seguir mostra as alterações para substituir a interface do usuário de identidade padrão por identidade em um aplicativo Web ASP.NET Core 2,1.The following highlighted code shows the changes to replace the default Identity UI with Identity in an ASP.NET Core 2.1 web app. Talvez você queira fazer isso para ter controle total da interface do usuário da identidade.You might want to do this to have full control of the Identity UI.

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().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        {
            options.AllowAreas = true;
            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>();
}

A identidade padrão é substituída no código a seguir:The default Identity is replaced in the following code:

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

O código a seguir define LoginPath, LogoutPathe AccessDeniedPath:The following code sets the LoginPath, LogoutPath, and AccessDeniedPath:

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

Registre uma implementação de IEmailSender, por exemplo:Register an IEmailSender implementation, for example:

// 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;
    }
}

Página desabilitar registroDisable register page

Para desabilitar o registro do usuário:To disable user registration:

  • Identidade Scaffold.Scaffold Identity. Inclua conta. Register, Account. login e Account. RegisterConfirmation.Include Account.Register, Account.Login, and Account.RegisterConfirmation. Por exemplo:For example:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Atualize áreas/identidade/páginas/conta/registro. cshtml. cs para que os usuários não possam se registrar neste ponto de extremidade:Update Areas/Identity/Pages/Account/Register.cshtml.cs so users can't register from this endpoint:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Atualize áreas/identidade/páginas/Account/Register. cshtml para que sejam consistentes com as alterações anteriores:Update Areas/Identity/Pages/Account/Register.cshtml to be consistent with the preceding changes:

    @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 áreas/identidade/páginas/conta/login. cshtmlComment out or remove the registration link from 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 áreas/identidade/páginas/conta/RegisterConfirmation .Update the Areas/Identity/Pages/Account/RegisterConfirmation page.

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

Usar outro aplicativo para adicionar usuáriosUse another app to add users

Forneça um mecanismo para adicionar usuários fora do aplicativo Web.Provide a mechanism to add users outside the web app. As opções para adicionar usuários incluem:Options to add users include:

  • Um aplicativo Web de administrador dedicado.A dedicated admin web app.
  • Um aplicativo de console.A console app.

O código a seguir descreve uma abordagem para adicionar usuários:The following code outlines one approach to adding users:

  • Uma lista de usuários é lida na memória.A list of users is read into memory.
  • Uma senha exclusiva forte é gerada para cada usuário.A strong unique password is generated for each user.
  • O usuário é adicionado ao banco de dados de identidade.The user is added to the Identity database.
  • O usuário é notificado e foi instruído a alterar a senha.The user is notified and told to change the password.
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:The following code outlines adding a user:


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.A similar approach can be followed for production scenarios.

Recursos adicionaisAdditional resources