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

De Rick AndersonBy Rick Anderson

ASP.NET Core fornece ASP.NET Core Identity como uma Razor biblioteca de classes.ASP.NET Core provides ASP.NET Core Identity as a Razor Class Library. Os aplicativos que incluem Identity o podem aplicar o scaffolder para adicionar seletivamente o código-fonte contido na Identity Razor biblioteca de classes (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. O código gerado tem precedência sobre o mesmo código no Identity RCL.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 Identity origem da interface do usuário 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 Identity pacote 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 Identity código 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ê precisa atualizar seu projeto para concluir o processo.Although the scaffolder generates most of the necessary code, you need to update your project to complete the process. Este documento explica as etapas necessárias para concluir uma Identity atualização do scaffolding.This document explains the steps needed to complete an Identity scaffolding update.

É 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 o Identity scaffolder.Inspect the changes after running the Identity scaffolder.

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 o Identity .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 scaffolding Identity .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.

Quando scaffolding Identity com um novo contexto de dados em um projeto com contas individuais existentes:When scaffolding Identity with a new data context into a project with existing individual accounts:

  • No Startup.ConfigureServices , remova as chamadas para:In Startup.ConfigureServices, remove the calls to:
    • AddDbContext
    • AddDefaultIdentity

Por exemplo, AddDbContext e AddDefaultIdentity são comentados no código a seguir:For example, AddDbContext and AddDefaultIdentity are commented out in the following code:

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 que está duplicado em áreas/ Identity / Identity HostingStartup.csThe preceeding code comments out the code that is duplicated in Areas/Identity/IdentityHostingStartup.cs

Normalmente, os aplicativos que foram criados com contas individuais não devem criar um novo contexto de dados.Typically, apps that were created with individual accounts should not create a new data context.

Scaffold Identity em um projeto vazioScaffold Identity into an empty project

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 novo item do com Scaffold , selecione identidade > Adicionar.From the left pane of the Add New Scaffolded Item 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:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/Views/Shared/_Layout.cshtml for MVC projects
      • Os aplicativos de servidor mais amseriais criados a partir do modelo de servidor mais incrivelmente ( blazorserver ) não são configurados para Razor pages ou MVC por padrão.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. Deixe a entrada da página de layout em branco.Leave the layout page entry blank.
    • Selecione o + botão para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • Selecione Adicionar.Select Add.

Atualize a Startup classe com um código semelhante ao seguinte:Update the Startup class with code similar to the following:

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.UseHsts is recommended but not required. Para obter mais informações, consulte protocolo de segurança de transporte estrito http.For more information, see HTTP Strict Transport Security Protocol.

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 console do Gerenciador de pacotesdo Visual Studio:In the Visual Studio Package Manager Console:

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

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

Scaffold Identity em um Razor projeto sem autorização existenteScaffold Identity into a Razor project without existing 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 novo item do com Scaffold , selecione identidade > Adicionar.From the left pane of the Add New Scaffolded Item 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:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/Views/Shared/_Layout.cshtml for MVC projects
      • Os aplicativos de servidor mais amseriais criados a partir do modelo de servidor mais incrivelmente ( blazorserver ) não são configurados para Razor pages ou MVC por padrão.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. Deixe a entrada da página de layout em branco.Leave the layout page entry blank.
    • Selecione o + botão para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • Selecione Adicionar.Select Add.

Identityé configurado em áreas/ Identity / Identity HostingStartup.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 console do Gerenciador de pacotesdo Visual Studio:In the Visual Studio Package Manager Console:

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

O parâmetro de nome "CreateIdentitySchema" para o comando Add-Migration é 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

Atualize a Startup classe com um código semelhante ao seguinte:Update the Startup class with code similar to the following:

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.UseHsts is recommended but not required. Para obter mais informações, consulte protocolo de segurança de transporte estrito http.For more information, see HTTP Strict Transport Security Protocol.

Alterações de layoutLayout changes

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

<!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.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

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

Scaffold Identity em um Razor projeto 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 para que o arquivo de layout não seja substituído por marcação incorreta.Select your existing layout page so your layout file isn't overwritten with incorrect markup. Quando um arquivo * _ layout. cshtml* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara projetos de servidor Razor Pages ou mais incrivelmente com a infraestrutura de Razor Pages existente~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC ou projetos de servidor mais incrivelmente com a infraestrutura MVC existente~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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.

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* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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 Identity opções são configuradas em áreas/ Identity / Identity HostingStartup.cs.Some Identity options are configured in Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.For more information, see IHostingStartup.

Scaffold Identity 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:

  • 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 novo item do com Scaffold , selecione identidade > Adicionar.From the left pane of the Add New Scaffolded Item 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:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/Views/Shared/_Layout.cshtml for MVC projects
      • Os aplicativos de servidor mais amseriais criados a partir do modelo de servidor mais incrivelmente ( blazorserver ) não são configurados para Razor pages ou MVC por padrão.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. Deixe a entrada da página de layout em branco.Leave the layout page entry blank.
    • Selecione o + botão para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 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 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.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

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

Identityé configurado em áreas/ Identity / Identity HostingStartup.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 console do Gerenciador de pacotesdo Visual Studio:In the Visual Studio Package Manager Console:

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

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

Atualize a Startup classe com um código semelhante ao seguinte:Update the Startup class with code similar to the following:

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.UseHsts is recommended but not required. Para obter mais informações, consulte protocolo de segurança de transporte estrito http.For more information, see HTTP Strict Transport Security Protocol.

Scaffold Identity 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 para que o arquivo de layout não seja substituído por marcação incorreta.Select your existing layout page so your layout file isn't overwritten with incorrect markup. Quando um arquivo * _ layout. cshtml* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara projetos de servidor Razor Pages ou mais incrivelmente com a infraestrutura de Razor Pages existente~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC ou projetos de servidor mais incrivelmente com a infraestrutura MVC existente~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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.

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* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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.

Scaffold Identity em um Blazor Server projeto sem autorização existenteScaffold Identity into a Blazor Server project without existing 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 novo item do com Scaffold , selecione identidade > Adicionar.From the left pane of the Add New Scaffolded Item 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:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/Views/Shared/_Layout.cshtml for MVC projects
      • Os aplicativos de servidor mais amseriais criados a partir do modelo de servidor mais incrivelmente ( blazorserver ) não são configurados para Razor pages ou MVC por padrão.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. Deixe a entrada da página de layout em branco.Leave the layout page entry blank.
    • Selecione o + botão para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • Selecione Adicionar.Select Add.

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

MigraçõesMigrations

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 console do Gerenciador de pacotesdo Visual Studio:In the Visual Studio Package Manager Console:

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

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

Passar um token XSRF para o aplicativoPass an XSRF token to the app

Tokens podem ser passados para componentes:Tokens can be passed to components:

  • Quando os tokens de autenticação são provisionados e salvos na autenticação cookie , eles podem ser passados para os componentes do.When authentication tokens are provisioned and saved to the authentication cookie, they can be passed to components.
  • Razoros componentes não podem usar HttpContext diretamente, portanto, não há como obter um token de XSRF (falsificação de solicitação) para postar no Identity ponto de extremidade de logout em /Identity/Account/Logout .Razor components can't use HttpContext directly, so there's no way to obtain an anti-request forgery (XSRF) token to POST to Identity's logout endpoint at /Identity/Account/Logout. Um token XSRF pode ser passado para componentes.An XSRF token can be passed to components.

Para obter mais informações, consulte ASP.NET Core Blazor Server cenários de segurança adicionais.For more information, see ASP.NET Core Blazor Server cenários de segurança adicionais.

No arquivo pages/_Host. cshtml , estabeleça o token depois de adicioná-lo às InitialApplicationState TokenProvider classes e:In the Pages/_Host.cshtml file, establish the token after adding it to the InitialApplicationState and TokenProvider classes:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

    XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};

Atualize o App componente (app. Razor) para atribuir InitialState.XsrfToken :Update the App component (App.razor) to assign the InitialState.XsrfToken:

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

O TokenProvider serviço demonstrado no tópico é usado no LoginDisplay componente na seção layout e alterações de fluxo de autenticação a seguir.The TokenProvider service demonstrated in the topic is used in the LoginDisplay component in the following Layout and authentication flow changes section.

Habilitar autenticaçãoEnable authentication

Na Startup classe:In the Startup class:

  • Confirme se as Razor páginas de serviços são adicionadas no Startup.ConfigureServices .Confirm that Razor Pages services are added in Startup.ConfigureServices.
  • Se estiver usando o TokenProvider, registre o serviço.If using the TokenProvider, register the service.
  • Chame UseDatabaseErrorPage no Application Builder no Startup.Configure para o ambiente de desenvolvimento.Call UseDatabaseErrorPage on the application builder in Startup.Configure for the Development environment.
  • Chamar UseAuthentication e UseAuthorization depois UseRouting .Call UseAuthentication and UseAuthorization after UseRouting.
  • Adicione um ponto de extremidade para Razor páginas.Add an endpoint for Razor Pages.
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSingleton<WeatherForecastService>();
    services.AddScoped<TokenProvider>();
}

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();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}

UseHstsé recomendado, mas não obrigatório.UseHsts is recommended but not required. Para obter mais informações, consulte protocolo de segurança de transporte estrito http.For more information, see HTTP Strict Transport Security Protocol.

Alterações no fluxo de layout e de autenticaçãoLayout and authentication flow changes

Adicione um RedirectToLogin componente (RedirectToLogin. Razor) à pasta compartilhada do aplicativo na raiz do projeto:Add a RedirectToLogin component (RedirectToLogin.razor) to the app's Shared folder in the project root:

@inject NavigationManager Navigation
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
            Uri.EscapeDataString(Navigation.Uri), true);
    }
}

Adicione um LoginDisplay componente (LoginDisplay. Razor) à pasta compartilhada do aplicativo. O serviço TokenProvider fornece o token XSRF para o formulário HTML que posta para o Identity ponto de extremidade de logout:The TokenProvider service provides the XSRF token for the HTML form that POSTs to Identity's logout endpoint:

@using Microsoft.AspNetCore.Components.Authorization
@inject NavigationManager Navigation
@inject TokenProvider TokenProvider

<AuthorizeView>
    <Authorized>
        <a href="Identity/Account/Manage/Index">
            Hello, @context.User.Identity.Name!
        </a>
        <form action="/Identity/Account/Logout?returnUrl=%2F" method="post">
            <button class="nav-link btn btn-link" type="submit">Logout</button>
            <input name="__RequestVerificationToken" type="hidden" 
                value="@TokenProvider.XsrfToken">
        </form>
    </Authorized>
    <NotAuthorized>
        <a href="Identity/Account/Register">Register</a>
        <a href="Identity/Account/Login">Login</a>
    </NotAuthorized>
</AuthorizeView>

No MainLayout componente (Shared/MainLayout. Razor), adicione o LoginDisplay componente ao <div> conteúdo do elemento de linha superior:In the MainLayout component (Shared/MainLayout.razor), add the LoginDisplay component to the top-row <div> element's content:

<div class="top-row px-4 auth">
    <LoginDisplay />
    <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>

Pontos de extremidade de autenticação de estiloStyle authentication endpoints

Como Blazor Server o usa páginas Razor Identity de páginas, o estilo da interface do usuário é alterado quando um visitante navega entre Identity páginas e componentes.Because Blazor Server uses Razor Pages Identity pages, the styling of the UI changes when a visitor navigates between Identity pages and components. Você tem duas opções para abordar os estilos de incongruous:You have two options to address the incongruous styles:

Componentes de compilação IdentityBuild Identity components

Uma abordagem para usar componentes do Identity em vez de páginas é criar Identity componentes.An approach to using components for Identity instead of pages is to build Identity components. Como SignInManager e UserManager não têm suporte em Razor componentes, use pontos de extremidade de API no Blazor Server aplicativo para processar ações de conta de usuário.Because SignInManager and UserManager aren't supported in Razor components, use API endpoints in the Blazor Server app to process user account actions.

Usar um layout personalizado com Blazor estilos de aplicativoUse a custom layout with Blazor app styles

O Identity layout de páginas e os estilos podem ser modificados para produzir páginas que usam o Blazor tema padrão.The Identity pages layout and styles can be modified to produce pages that use the default Blazor theme.

Observação

O exemplo nesta seção é meramente um ponto de partida para personalização.The example in this section is merely a starting point for customization. Um trabalho adicional é provavelmente necessário para a melhor experiência do usuário.Additional work is likely required for the best user experience.

Crie um novo NavMenu_IdentityLayout componente (Shared/NavMenu_ Identity layout. Razor).Create a new NavMenu_IdentityLayout component (Shared/NavMenu_IdentityLayout.razor). Para a marcação e o código do componente, use o mesmo conteúdo do componente do aplicativo NavMenu (Shared/NavMenu. Razor).For the markup and code of the component, use the same content of the app's NavMenu component (Shared/NavMenu.razor). Remova todos os NavLink s para componentes que não podem ser acessados anonimamente porque os redirecionamentos automáticos no RedirectToLogin componente falham para componentes que exigem autenticação ou autorização.Strip out any NavLinks to components that can't be reached anonymously because automatic redirects in the RedirectToLogin component fail for components requiring authentication or authorization.

No arquivo pages/Shared/layout. cshtml , faça as seguintes alterações:In the Pages/Shared/Layout.cshtml file, make the following changes:

  • Adicione Razor diretivas à parte superior do arquivo para usar auxiliares de marca e os componentes do aplicativo na pasta compartilhada :Add Razor directives to the top of the file to use Tag Helpers and the app's components in the Shared folder:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @using {APPLICATION ASSEMBLY}.Shared
    

    Substituir {APPLICATION ASSEMBLY} pelo nome do assembly do aplicativo.Replace {APPLICATION ASSEMBLY} with the app's assembly name.

  • Adicione uma <base> marca e uma Blazor folha <link> de estilos ao <head> conteúdo:Add a <base> tag and Blazor stylesheet <link> to the <head> content:

    <base href="~/" />
    <link rel="stylesheet" href="~/css/site.css" />
    
  • Altere o conteúdo da <body> marca para o seguinte:Change the content of the <body> tag to the following:

    <div class="sidebar" style="float:left">
        <component type="typeof(NavMenu_IdentityLayout)" 
            render-mode="ServerPrerendered" />
    </div>
    
    <div class="main" style="padding-left:250px">
        <div class="top-row px-4">
            @{
                var result = Engine.FindView(ViewContext, "_LoginPartial", 
                    isMainPage: false);
            }
            @if (result.Success)
            {
                await Html.RenderPartialAsync("_LoginPartial");
            }
            else
            {
                throw new InvalidOperationException("The default Identity UI " +
                    "layout requires a partial view '_LoginPartial'.");
            }
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/Identity/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
    <script src="_framework/blazor.server.js"></script>
    

Scaffold Identity em um Blazor Server projeto com autorizaçãoScaffold Identity into a Blazor Server 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 para que o arquivo de layout não seja substituído por marcação incorreta.Select your existing layout page so your layout file isn't overwritten with incorrect markup. Quando um arquivo * _ layout. cshtml* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara projetos de servidor Razor Pages ou mais incrivelmente com a infraestrutura de Razor Pages existente~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC ou projetos de servidor mais incrivelmente com a infraestrutura MVC existente~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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.

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* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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 Identity opções são configuradas em áreas/ Identity / Identity HostingStartup.cs.Some Identity options are configured in Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.For more information, see IHostingStartup.

Criar Identity origem da interface do usuário completaCreate full Identity UI source

Para manter o controle total da Identity interface do usuário, execute o Identity 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 Identity interface do usuário padrão por Identity 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 Identity usuário.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>();
}

O padrão Identity é substituído 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 IEmailSender implementação, 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;
    }
}

Configuração de senhaPassword configuration

Se PasswordOptions o estiver configurado no Startup.ConfigureServices , a configuração de [StringLength] atributo poderá ser necessária para a Password propriedade em Identity páginas com Scaffold.If PasswordOptions are configured in Startup.ConfigureServices, [StringLength] attribute configuration might be required for the Password property in scaffolded Identity pages. InputModel``Passwordas propriedades são encontradas nos seguintes arquivos:InputModel Password properties are found in the following files:

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

Desabilitar uma páginaDisable a page

Estas seções mostram como desabilitar a página de registro, mas a abordagem pode ser usada para desabilitar qualquer página.This sections show how to disable the register page but the approach can be used to disable any page.

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

  • Scaffold Identity .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"
    
  • Atualizar áreas/ Identity /pages/Account/Register.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/ Identity /pages/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/ Identity /pages/Account/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/ Identity /pages/Account/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 Identity banco de dados.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.

Impedir a publicação de Identity ativos estáticosPrevent publish of static Identity assets

Para evitar a publicação de ativos estáticos na Identity raiz da Web, consulte Introdução ao Identity no ASP.NET Core .To prevent publishing static Identity assets to the web root, see Introdução ao Identity no ASP.NET Core.

Recursos adicionaisAdditional resources

ASP.NET Core 2,1 e posterior fornece ASP.NET Core Identity como uma Razor biblioteca de classes.ASP.NET Core 2.1 and later provides ASP.NET Core Identity as a Razor Class Library. Os aplicativos que incluem Identity o podem aplicar o scaffolder para adicionar seletivamente o código-fonte contido na Identity Razor biblioteca de classes (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. O código gerado tem precedência sobre o mesmo código no Identity RCL.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 Identity pacote 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 Identity código 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 Identity atualização do scaffolding.This document explains the steps needed to complete an Identity scaffolding update.

Quando o Identity scaffolder é executado, um arquivo de 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 de ScaffoldingReadme.txt contém instruções gerais sobre o que é necessário para concluir a Identity atualização do 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 de 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 o Identity 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 o Identity .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 scaffolding Identity .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 Identity em um projeto vazioScaffold Identity into an empty project

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 novo item do com Scaffold , selecione identidade > Adicionar.From the left pane of the Add New Scaffolded Item 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:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/Views/Shared/_Layout.cshtml for MVC projects
      • Os aplicativos de servidor mais amseriais criados a partir do modelo de servidor mais incrivelmente ( blazorserver ) não são configurados para Razor pages ou MVC por padrão.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. Deixe a entrada da página de layout em branco.Leave the layout page entry blank.
    • Selecione o + botão para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • Selecione Adicionar.Select Add.

Adicione as seguintes chamadas realçadas à Startup classe: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é recomendado, mas não obrigatório.UseHsts is recommended but not required. Para obter mais informações, consulte protocolo de segurança de transporte estrito http.For more information, see HTTP Strict Transport Security Protocol.

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 console do Gerenciador de pacotesdo Visual Studio:In the Visual Studio Package Manager Console:

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

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

Scaffold Identity em um Razor projeto sem autorização existenteScaffold Identity into a Razor project without existing 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 novo item do com Scaffold , selecione identidade > Adicionar.From the left pane of the Add New Scaffolded Item 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:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/Views/Shared/_Layout.cshtml for MVC projects
      • Os aplicativos de servidor mais amseriais criados a partir do modelo de servidor mais incrivelmente ( blazorserver ) não são configurados para Razor pages ou MVC por padrão.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. Deixe a entrada da página de layout em branco.Leave the layout page entry blank.
    • Selecione o + botão para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • Selecione Adicionar.Select Add.

Identityé configurado em áreas/ Identity / Identity HostingStartup.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 console do Gerenciador de pacotesdo Visual Studio:In the Visual Studio Package Manager Console:

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

O parâmetro de nome "CreateIdentitySchema" para o comando Add-Migration é 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 Configure método da Startup classe, 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é recomendado, mas não obrigatório.UseHsts is recommended but not required. Para obter mais informações, consulte protocolo de segurança de transporte estrito http.For more information, see HTTP Strict Transport Security Protocol.

Alterações de layoutLayout changes

Opcional: Adicione o logon Partial ( _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 Identity em um Razor projeto 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 para que o arquivo de layout não seja substituído por marcação incorreta.Select your existing layout page so your layout file isn't overwritten with incorrect markup. Quando um arquivo * _ layout. cshtml* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara projetos de servidor Razor Pages ou mais incrivelmente com a infraestrutura de Razor Pages existente~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC ou projetos de servidor mais incrivelmente com a infraestrutura MVC existente~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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.

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* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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 Identity opções são configuradas em áreas/ Identity / Identity HostingStartup.cs.Some Identity options are configured in Areas/Identity/IdentityHostingStartup.cs. Para obter mais informações, consulte IHostingStartup.For more information, see IHostingStartup.

Scaffold Identity 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:

  • 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 novo item do com Scaffold , selecione identidade > Adicionar.From the left pane of the Add New Scaffolded Item 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:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/Views/Shared/_Layout.cshtml for MVC projects
      • Os aplicativos de servidor mais amseriais criados a partir do modelo de servidor mais incrivelmente ( blazorserver ) não são configurados para Razor pages ou MVC por padrão.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. Deixe a entrada da página de layout em branco.Leave the layout page entry blank.
    • Selecione o + botão para criar uma nova classe de contexto de dados.Select the + button to create a new Data context class. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 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

Identityé configurado em áreas/ Identity / Identity HostingStartup.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 console do Gerenciador de pacotesdo Visual Studio:In the Visual Studio Package Manager Console:

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

O parâmetro de nome "CreateIdentitySchema" para o comando Add-Migration é 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é recomendado, mas não obrigatório.UseHsts is recommended but not required. Para obter mais informações, consulte protocolo de segurança de transporte estrito http.For more information, see HTTP Strict Transport Security Protocol.

Scaffold Identity 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 para que o arquivo de layout não seja substituído por marcação incorreta.Select your existing layout page so your layout file isn't overwritten with incorrect markup. Quando um arquivo * _ layout. cshtml* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara projetos de servidor Razor Pages ou mais incrivelmente com a infraestrutura de Razor Pages existente~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC ou projetos de servidor mais incrivelmente com a infraestrutura MVC existente~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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.

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* existente é selecionado, ele não é substituído.When an existing _Layout.cshtml file is selected, it is not overwritten. Por exemplo:For example:
      • ~/Pages/Shared/_Layout.cshtmlpara Razor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlpara projetos do MVC~/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. Aceite o valor padrão ou especifique uma classe (por exemplo, MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 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 Identity origem da interface do usuário completaCreate full Identity UI source

Para manter o controle total da Identity interface do usuário, execute o Identity 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 Identity interface do usuário padrão por Identity 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 Identity usuário.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>();
}

O padrão Identity é substituído 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 IEmailSender implementação, 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;
    }
}

Configuração de senhaPassword configuration

Se PasswordOptions o estiver configurado no Startup.ConfigureServices , a configuração de [StringLength] atributo poderá ser necessária para a Password propriedade em Identity páginas com Scaffold.If PasswordOptions are configured in Startup.ConfigureServices, [StringLength] attribute configuration might be required for the Password property in scaffolded Identity pages. InputModel``Passwordas propriedades são encontradas nos seguintes arquivos:InputModel Password properties are found in the following files:

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

Página desabilitar registroDisable register page

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

  • Scaffold Identity .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"
    
  • Atualizar áreas/ Identity /pages/Account/Register.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/ Identity /pages/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/ Identity /pages/Account/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/ Identity /pages/Account/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 Identity banco de dados.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