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.

Para obter informações sobre como exigir globalmente que todos os usuários sejam autenticados, consulte exigir usuários autenticados.For information on how to globally require all users to be authenticated, see Require authenticated users.

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.

Identity Normalmente, o é configurado usando um banco de dados SQL Server para armazenar nomes de usuário, senhas e de perfil.Identity 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 o Identity , consulte próximas etapas.For more detailed instructions about creating apps that use Identity, see Next Steps.

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.

Exiba ou baixe 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.UseSqlite(
        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 .Identity is enabled by calling UseAuthentication. UseAuthentication Adiciona 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.UseAuthorization está 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.

Scaffold registro, logon, LogOut e RegisterConfirmationScaffold Register, Login, LogOut, and RegisterConfirmation

Adicione os Register Login arquivos,, LogOut e RegisterConfirmation .Add the Register, Login, LogOut, and RegisterConfirmation 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 botão registrar na Register página, a RegisterModel.OnPostAsync ação é invocada.When a user clicks the Register button on the Register page, 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();
}

Desabilitar verificação de conta padrãoDisable default account verification

Com os modelos padrão, o usuário é redirecionado para o Account.RegisterConfirmation onde ele pode selecionar um link para que a conta seja confirmada.With the default templates, the user is redirected to the Account.RegisterConfirmation where they can select a link to have the account confirmed. O padrão Account.RegisterConfirmation é usado somente para teste; a verificação automática de conta deve ser desabilitada em um aplicativo de produção.The default Account.RegisterConfirmation is used only for testing, automatic account verification should be disabled in a production app.

Para exigir uma conta confirmada e impedir o logon imediato no registro, defina DisplayConfirmAccountLink = false em /areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs:To require a confirmed account and prevent immediate login at registration, set DisplayConfirmAccountLink = false in /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs:

[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly IEmailSender _sender;

    public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
    {
        _userManager = userManager;
        _sender = sender;
    }

    public string Email { get; set; }

    public bool DisplayConfirmAccountLink { get; set; }

    public string EmailConfirmationUrl { get; set; }

    public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
    {
        if (email == null)
        {
            return RedirectToPage("/Index");
        }

        var user = await _userManager.FindByEmailAsync(email);
        if (user == null)
        {
            return NotFound($"Unable to load user with email '{email}'.");
        }

        Email = email;
        // Once you add a real email sender, you should remove this code that lets you confirm the account
        DisplayConfirmAccountLink = false;
        if (DisplayConfirmAccountLink)
        {
            var userId = await _userManager.GetUserIdAsync(user);
            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            EmailConfirmationUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
                protocol: Request.Scheme);
        }

        return Page();
    }
}

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>

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

Apresenta IdentityExplore Identity

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

Identity QCIdentity 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 o 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 Core IdentityMigrating 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.

ADDDEFAULT Identity e AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentity foi 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 a Identity fonte padrão 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.

Identity o pode ser configurado usando um banco de dados SQL Server para armazenar nomes de usuário, senhas e de perfil.Identity 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.

Exiba ou baixe 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.

ADDDEFAULT Identity e AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentity foi 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 a Identity fonte padrão 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.Identity is enabled by calling UseAuthentication. UseAuthentication Adiciona 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 Identity classe Options 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>


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

Apresenta IdentityExplore Identity

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

Identity QCIdentity 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 o 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 Core IdentityMigrating 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