Introdução ao Identity no ASP.NET CoreIntroduction to Identity on ASP.NET Core

De Rick AndersonBy Rick Anderson

ASP.NET Core Identity :ASP.NET Core Identity:

  • É uma API que dá suporte à funcionalidade de logon da interface do usuário.Is an API that supports user interface (UI) login functionality.
  • Gerencia usuários, senhas, dados de perfil, funções, declarações, tokens, confirmação por email e muito mais.Manages users, passwords, profile data, roles, claims, tokens, email confirmation, and more.

Os usuários podem criar uma conta com as informações de logon armazenadas no Identity ou podem usar um provedor de logon externo.Users can create an account with the login information stored in Identity or they can use an external login provider. Os provedores de logon externo com suporte incluem o Facebook, o Google, a conta da Microsoft e o Twitter.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

O Identity código-fonte está disponível no github.The Identity source code is available on GitHub. Scaffold Identity e exiba os arquivos gerados para revisar a interação do modelo com o Identity .Scaffold Identity and view the generated files to review the template interaction with Identity.

IdentityNormalmente, o é configurado usando um banco de dados SQL Server para armazenar nomes de usuário, senhas e de perfil. is typically configured using a SQL Server database to store user names, passwords, and profile data. Como alternativa, outro armazenamento persistente pode ser usado, por exemplo, o armazenamento de tabelas do Azure.Alternatively, another persistent store can be used, for example, Azure Table Storage.

Neste tópico, você aprenderá a usar o Identity para registrar, fazer logon e fazer logoff de um usuário.In this topic, you learn how to use Identity to register, log in, and log out a user. Observação: os modelos tratam o nome de usuário e o email como o mesmo para os usuários.Note: the templates treat username and email as the same for users. Para obter instruções mais detalhadas sobre como criar aplicativos que usam Identity o, consulte a seção próximas etapas no final deste artigo.For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

A plataforma Microsoft Identity é:Microsoft identity platform is:

  • Uma evolução da plataforma de desenvolvedor do Azure Active Directory (AD do Azure).An evolution of the Azure Active Directory (Azure AD) developer platform.
  • Não relacionado a ASP.NET Core Identity .Unrelated to ASP.NET Core Identity.

ASP.NET Core identidade adiciona a funcionalidade de logon da interface do usuário para ASP.NET Core aplicativos Web.ASP.NET Core Identity adds user interface (UI) login functionality to ASP.NET Core web apps. Para proteger APIs Web e SPAs, use um dos seguintes:To secure web APIs and SPAs, use one of the following:

IdentityServer4 é uma estrutura de OpenID Connect e OAuth 2,0 para ASP.NET Core.IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core. O IdentityServer4 habilita os seguintes recursos de segurança:IdentityServer4 enables the following security features:

  • AaaS (autenticação como serviço)Authentication as a Service (AaaS)
  • Logon único/logoff (SSO) em vários tipos de aplicativosSingle sign-on/off (SSO) over multiple application types
  • Controle de acesso para APIsAccess control for APIs
  • Gateway de FederaçãoFederation Gateway

Para obter mais informações, consulte Bem-vindo ao IdentityServer4.For more information, see Welcome to IdentityServer4.

Exibir ou baixar o código de exemplo (como baixar)).View or download the sample code (how to download)).

Criar um aplicativo Web com autenticaçãoCreate a Web app with authentication

Crie um projeto de aplicativo Web ASP.NET Core com contas de usuário individuais.Create an ASP.NET Core Web Application project with Individual User Accounts.

  • Selecione arquivo > novo > projeto.Select File > New > Project.
  • Selecione Aplicativo Web ASP.NET Core.Select ASP.NET Core Web Application. Nomeie o projeto WebApp1 para ter o mesmo namespace do download do projeto.Name the project WebApp1 to have the same namespace as the project download. Clique em OK.Click OK.
  • Selecione um aplicativo WebASP.NET Core e, em seguida, selecione alterar autenticação.Select an ASP.NET Core Web Application, then select Change Authentication.
  • Selecione contas de usuário individuais e clique em OK.Select Individual User Accounts and click OK.

O projeto gerado fornece ASP.NET Core Identity como uma Razor biblioteca de classes.The generated project provides ASP.NET Core Identity as a Razor Class Library. A Identity Razor biblioteca de classes expõe pontos de extremidade com a Identity área.The Identity Razor Class Library exposes endpoints with the Identity area. Por exemplo:For example:

  • /Identity/Account/Login/Identity/Account/Login
  • /Identity/Account/Logout/Identity/Account/Logout
  • /Identity/Account/Manage/Identity/Account/Manage

Aplicar migraçõesApply migrations

Aplique as migrações para inicializar o banco de dados.Apply the migrations to initialize the database.

Execute o seguinte comando no console do Gerenciador de pacotes (PMC):Run the following command in the Package Manager Console (PMC):

PM> Update-Database

Teste de registro e logonTest Register and Login

Execute o aplicativo e registre um usuário.Run the app and register a user. Dependendo do tamanho da tela, talvez seja necessário selecionar o botão de alternância de navegação para ver os links de registro e logon .Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Exibir o banco de dados de identidadeView the Identity database

  • No menu Exibir , selecione pesquisador de objetos do SQL Server (SSOX).From the View menu, select SQL Server Object Explorer (SSOX).
  • Navegue até (LocalDB) MSSQLLocalDB (SQL Server 13).Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Clique com o botão direito do mouse em dbo. AspNetUsers > exibir dados:Right-click on dbo.AspNetUsers > View Data:

Menu contextual na tabela AspNetUsers no Pesquisador de Objetos do SQL Server

Configurar Identity serviçosConfigure Identity services

Os serviços são adicionados no ConfigureServices .Services are added in ConfigureServices. O padrão típico consiste em chamar todos os métodos Add{Service} e, em seguida, chamar todos os métodos services.Configure{Service}.The typical pattern is to call all the Add{Service} methods, and then call all the services.Configure{Service} methods.

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.AddRazorPages();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });
}

O código realçado anterior Identity é configurado com valores de opção padrão.The preceding highlighted code configures Identity with default option values. Os serviços são disponibilizados para o aplicativo por meio de injeção de dependência.Services are made available to the app through dependency injection.

Identityé habilitado chamando UseAuthentication . is enabled by calling UseAuthentication. UseAuthenticationAdiciona o middleware de autenticação ao pipeline de solicitação.UseAuthentication adds authentication middleware to the request pipeline.

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();
    });
}

O aplicativo gerado por modelo não usa autorização.The template-generated app doesn't use authorization. app.UseAuthorizationestá incluído para garantir que ele seja adicionado na ordem correta caso o aplicativo adicione autorização.app.UseAuthorization is included to ensure it's added in the correct order should the app add authorization. UseRouting, UseAuthentication , UseAuthorization e UseEndpoints devem ser chamados na ordem mostrada no código anterior.UseRouting, UseAuthentication, UseAuthorization, and UseEndpoints must be called in the order shown in the preceding code.

Para obter mais informações sobre o IdentityOptions e o Startup , consulte IdentityOptions e inicialização do aplicativo.For more information on IdentityOptions and Startup, see IdentityOptions and Application Startup.

Registro em Scaffold, logon e logoffScaffold Register, Login, and LogOut

Adicione os arquivos de registro, logon e LogOut.Add the Register, Login, and LogOut files. Siga a identidade do Scaffold em um Razor projeto com instruções de autorização para gerar o código mostrado nesta seção.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Examinar registroExamine Register

Quando um usuário clica no link registrar , a RegisterModel.OnPostAsync ação é invocada.When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. O usuário é criado por createasync no _userManager objeto:The user is created by CreateAsync on the _userManager object:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
                                          .ToList();
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            if (_userManager.Options.SignIn.RequireConfirmedAccount)
            {
                return RedirectToPage("RegisterConfirmation", 
                                      new { email = Input.Email });
            }
            else
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
                return LocalRedirect(returnUrl);
            }
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Se o usuário tiver sido criado com êxito, o usuário será conectado pela chamada para _signInManager.SignInAsync .If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

Consulte confirmação da conta para obter as etapas para impedir o logon imediato no registro.See account confirmation for steps to prevent immediate login at registration.

Fazer logonLog in

O formulário de logon é exibido quando:The Login form is displayed when:

  • O link logon está selecionado.The Log in link is selected.
  • Um usuário tenta acessar uma página restrita que não tem autorização para acessar ou quando elas não foram autenticadas pelo sistema.A user attempts to access a restricted page that they aren't authorized to access or when they haven't been authenticated by the system.

Quando o formulário na página de logon é enviado, a OnPostAsync ação é chamada.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsyncé chamado no _signInManager objeto.PasswordSignInAsync is called on the _signInManager object.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email,
                           Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new
            {
                ReturnUrl = returnUrl,
                RememberMe = Input.RememberMe
            });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Para obter informações sobre como tomar decisões de autorização, consulte Introdução à autorização no ASP.NET Core .For information on how to make authorization decisions, see Introdução à autorização no ASP.NET Core.

Faça logoffLog out

O link fazer logoff invoca a LogoutModel.OnPost ação.The Log out link invokes the LogoutModel.OnPost action.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                return RedirectToPage();
            }
        }
    }
}

No código anterior, o código return RedirectToPage(); precisa ser um redirecionamento para que o navegador execute uma nova solicitação e a identidade do usuário seja atualizada.In the preceding code, the code return RedirectToPage(); needs to be a redirect so that the browser performs a new request and the identity for the user gets updated.

SignOutAsync limpa as declarações do usuário armazenadas em um cookie.SignOutAsync clears the user's claims stored in a cookie.

Post é especificado nas páginas/Shared/_LoginPartial. cshtml:Post is specified in the Pages/Shared/_LoginPartial.cshtml:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
        <a  class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" 
                                              title="Manage">Hello @User.Identity.Name!</a>
    </li>
    <li class="nav-item">
        <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                                  asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                                  method="post" >
            <button  type="submit" class="nav-link btn btn-link text-dark">Logout</button>
        </form>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
    </li>
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
}
</ul>

TestarIdentityTest Identity

Os modelos de projeto Web padrão permitem acesso anônimo às home pages.The default web project templates allow anonymous access to the home pages. Para testar Identity , adicione [Authorize] :To test Identity, add [Authorize]:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        private readonly ILogger<PrivacyModel> _logger;

        public PrivacyModel(ILogger<PrivacyModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
        }
    }
}

Se você estiver conectado, saia. Execute o aplicativo e selecione o link de privacidade .If you are signed in, sign out. Run the app and select the Privacy link. Você é redirecionado à página de logon.You are redirected to the login page.

ApresentaIdentityExplore Identity

Para explorar Identity mais detalhadamente:To explore Identity in more detail:

IdentityQC Components

Todos os Identity pacotes NuGet dependentes são incluídos na estrutura compartilhada ASP.NET Core.All the Identity-dependent NuGet packages are included in the ASP.NET Core shared framework.

O pacote principal para o Identity é Microsoft. AspNetCore Identity ..The primary package for Identity is Microsoft.AspNetCore.Identity. Esse pacote contém o conjunto principal de interfaces para ASP.NET Core Identity e é incluído pelo Microsoft.AspNetCore.Identity.EntityFrameworkCore .This package contains the core set of interfaces for ASP.NET Core Identity, and is included by Microsoft.AspNetCore.Identity.EntityFrameworkCore.

Migrando para o ASP.NET CoreIdentityMigrating to ASP.NET Core Identity

Para obter mais informações e diretrizes sobre como migrar seu Identity repositório existente, consulte Identity migrar autenticação e .For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

Definindo a força da senhaSetting password strength

Consulte configuração para um exemplo que define os requisitos mínimos de senha.See Configuration for a sample that sets the minimum password requirements.

AddDefaultIdentity e addidentityAddDefaultIdentity and AddIdentity

AddDefaultIdentityfoi introduzido no ASP.NET Core 2,1.AddDefaultIdentity was introduced in ASP.NET Core 2.1. Chamar AddDefaultIdentity é semelhante a chamar o seguinte:Calling AddDefaultIdentity is similar to calling the following:

Consulte AddDefaultIdentity Source para obter mais informações.See AddDefaultIdentity source for more information.

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

Para evitar a publicação de ativos estáticos Identity (folhas de estilo e arquivos JavaScript para Identity a interface do usuário) na raiz da Web, adicione a seguinte ResolveStaticWebAssetsInputsDependsOn propriedade e RemoveIdentityAssets destino ao arquivo de projeto do aplicativo:To prevent publishing static Identity assets (stylesheets and JavaScript files for Identity UI) to the web root, add the following ResolveStaticWebAssetsInputsDependsOn property and RemoveIdentityAssets target to the app's project file:

<PropertyGroup>
  <ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>

<Target Name="RemoveIdentityAssets">
  <ItemGroup>
    <StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
  </ItemGroup>
</Target>

Próximas etapasNext Steps

De Rick AndersonBy Rick Anderson

ASP.NET Core Identity é um sistema de associação que adiciona a funcionalidade de logon a aplicativos ASP.NET Core.ASP.NET Core Identity is a membership system that adds login functionality to ASP.NET Core apps. Os usuários podem criar uma conta com as informações de logon armazenadas no Identity ou podem usar um provedor de logon externo.Users can create an account with the login information stored in Identity or they can use an external login provider. Os provedores de logon externo com suporte incluem o Facebook, o Google, a conta da Microsoft e o Twitter.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

Identityo pode ser configurado usando um banco de dados SQL Server para armazenar nomes de usuário, senhas e de perfil. can be configured using a SQL Server database to store user names, passwords, and profile data. Como alternativa, outro armazenamento persistente pode ser usado, por exemplo, o armazenamento de tabelas do Azure.Alternatively, another persistent store can be used, for example, Azure Table Storage.

Exibir ou baixar o código de exemplo (como baixar)).View or download the sample code (how to download)).

Neste tópico, você aprenderá a usar o Identity para registrar, fazer logon e fazer logoff de um usuário.In this topic, you learn how to use Identity to register, log in, and log out a user. Para obter instruções mais detalhadas sobre como criar aplicativos que usam Identity o, consulte a seção próximas etapas no final deste artigo.For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

AddDefaultIdentity e addidentityAddDefaultIdentity and AddIdentity

AddDefaultIdentityfoi introduzido no ASP.NET Core 2,1.AddDefaultIdentity was introduced in ASP.NET Core 2.1. Chamar AddDefaultIdentity é semelhante a chamar o seguinte:Calling AddDefaultIdentity is similar to calling the following:

Consulte AddDefaultIdentity Source para obter mais informações.See AddDefaultIdentity source for more information.

Criar um aplicativo Web com autenticaçãoCreate a Web app with authentication

Crie um projeto de aplicativo Web ASP.NET Core com contas de usuário individuais.Create an ASP.NET Core Web Application project with Individual User Accounts.

  • Selecione arquivo > novo > projeto.Select File > New > Project.
  • Selecione Aplicativo Web ASP.NET Core.Select ASP.NET Core Web Application. Nomeie o projeto WebApp1 para ter o mesmo namespace do download do projeto.Name the project WebApp1 to have the same namespace as the project download. Clique em OK.Click OK.
  • Selecione um aplicativo WebASP.NET Core e, em seguida, selecione alterar autenticação.Select an ASP.NET Core Web Application, then select Change Authentication.
  • Selecione contas de usuário individuais e clique em OK.Select Individual User Accounts and click OK.

O projeto gerado fornece ASP.NET Core Identity como uma Razor biblioteca de classes.The generated project provides ASP.NET Core Identity as a Razor Class Library. A Identity Razor biblioteca de classes expõe pontos de extremidade com a Identity área.The Identity Razor Class Library exposes endpoints with the Identity area. Por exemplo:For example:

  • /Identity/Account/Login/Identity/Account/Login
  • /Identity/Account/Logout/Identity/Account/Logout
  • /Identity/Account/Manage/Identity/Account/Manage

Aplicar migraçõesApply migrations

Aplique as migrações para inicializar o banco de dados.Apply the migrations to initialize the database.

Execute o seguinte comando no console do Gerenciador de pacotes (PMC):Run the following command in the Package Manager Console (PMC):

Update-Database

Teste de registro e logonTest Register and Login

Execute o aplicativo e registre um usuário.Run the app and register a user. Dependendo do tamanho da tela, talvez seja necessário selecionar o botão de alternância de navegação para ver os links de registro e logon .Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Exibir o banco de dados de identidadeView the Identity database

  • No menu Exibir , selecione pesquisador de objetos do SQL Server (SSOX).From the View menu, select SQL Server Object Explorer (SSOX).
  • Navegue até (LocalDB) MSSQLLocalDB (SQL Server 13).Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Clique com o botão direito do mouse em dbo. AspNetUsers > exibir dados:Right-click on dbo.AspNetUsers > View Data:

Menu contextual na tabela AspNetUsers no Pesquisador de Objetos do SQL Server

Configurar Identity serviçosConfigure Identity services

Os serviços são adicionados no ConfigureServices .Services are added in ConfigureServices. O padrão típico consiste em chamar todos os métodos Add{Service} e, em seguida, chamar todos os métodos services.Configure{Service}.The typical pattern is to call all the Add{Service} methods, and then call all the services.Configure{Service} methods.

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.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

O código anterior Identity é configurado com valores de opção padrão.The preceding code configures Identity with default option values. Os serviços são disponibilizados para o aplicativo por meio de injeção de dependência.Services are made available to the app through dependency injection.

Identityé habilitado chamando UseAuthentication. is enabled by calling UseAuthentication. UseAuthenticationAdiciona o middleware de autenticação ao pipeline de solicitação.UseAuthentication adds authentication middleware to the request pipeline.

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

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

    app.UseAuthentication();

    app.UseMvc();
}

Para obter mais informações, consulte a classe identityoptions e a inicialização do aplicativo.For more information, see the IdentityOptions Class and Application Startup.

Registro em Scaffold, logon e logoffScaffold Register, Login, and LogOut

Siga a identidade do Scaffold em um Razor projeto com instruções de autorização para gerar o código mostrado nesta seção.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Adicione os arquivos de registro, logon e LogOut.Add the Register, Login, and LogOut files.

Examinar registroExamine Register

Quando um usuário clica no link registrar , a RegisterModel.OnPostAsync ação é invocada.When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. O usuário é criado por createasync no _userManager objeto:The user is created by CreateAsync on the _userManager object:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            await _signInManager.SignInAsync(user, isPersistent: false);
            return LocalRedirect(returnUrl);
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Se o usuário tiver sido criado com êxito, o usuário será conectado pela chamada para _signInManager.SignInAsync .If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

Observação: Consulte confirmação da conta para obter as etapas para impedir o logon imediato no registro.Note: See account confirmation for steps to prevent immediate login at registration.

Fazer logonLog in

O formulário de logon é exibido quando:The Login form is displayed when:

  • O link logon está selecionado.The Log in link is selected.
  • Um usuário tenta acessar uma página restrita que não tem autorização para acessar ou quando elas não foram autenticadas pelo sistema.A user attempts to access a restricted page that they aren't authorized to access or when they haven't been authenticated by the system.

Quando o formulário na página de logon é enviado, a OnPostAsync ação é chamada.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsyncé chamado no _signInManager objeto.PasswordSignInAsync is called on the _signInManager object.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email, 
            Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Para obter informações sobre como tomar decisões de autorização, consulte Introdução à autorização no ASP.NET Core .For information on how to make authorization decisions, see Introdução à autorização no ASP.NET Core.

Faça logoffLog out

O link fazer logoff invoca a LogoutModel.OnPost ação.The Log out link invokes the LogoutModel.OnPost action.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                // This needs to be a redirect so that the browser performs a new
                // request and the identity for the user gets updated.
                return RedirectToPage();
            }
        }
    }
}

SignOutAsync limpa as declarações do usuário armazenadas em um cookie.SignOutAsync clears the user's claims stored in a cookie.

Post é especificado nas páginas/Shared/_LoginPartial. cshtml:Post is specified in the Pages/Shared/_LoginPartial.cshtml:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
    @if (SignInManager.IsSignedIn(User))
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity"
               asp-page="/Account/Manage/Index"
               title="Manage">Hello@User.Identity.Name!</a>
        </li>
        <li class="nav-item">
            <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                   asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                   method="post">
                <button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
            </form>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
        </li>
    }
</ul>


TestarIdentityTest Identity

Os modelos de projeto Web padrão permitem acesso anônimo às home pages.The default web project templates allow anonymous access to the home pages. Para testar Identity , adicione [Authorize] à página de privacidade.To test Identity, add [Authorize] to the Privacy page.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

Se você estiver conectado, saia. Execute o aplicativo e selecione o link de privacidade .If you are signed in, sign out. Run the app and select the Privacy link. Você é redirecionado à página de logon.You are redirected to the login page.

ApresentaIdentityExplore Identity

Para explorar Identity mais detalhadamente:To explore Identity in more detail:

IdentityQC Components

Todos os Identity pacotes NuGet dependentes estão incluídos no metapacote Microsoft. AspNetCore. app.All the Identity dependent NuGet packages are included in the Microsoft.AspNetCore.App metapackage.

O pacote principal para o Identity é Microsoft. AspNetCore Identity ..The primary package for Identity is Microsoft.AspNetCore.Identity. Esse pacote contém o conjunto principal de interfaces para ASP.NET Core Identity e é incluído pelo Microsoft.AspNetCore.Identity.EntityFrameworkCore .This package contains the core set of interfaces for ASP.NET Core Identity, and is included by Microsoft.AspNetCore.Identity.EntityFrameworkCore.

Migrando para o ASP.NET CoreIdentityMigrating to ASP.NET Core Identity

Para obter mais informações e diretrizes sobre como migrar seu Identity repositório existente, consulte Identity migrar autenticação e .For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

Definindo a força da senhaSetting password strength

Consulte configuração para um exemplo que define os requisitos mínimos de senha.See Configuration for a sample that sets the minimum password requirements.

Próximas etapasNext Steps