Adicionando ASP.NET Identity a um projeto de Web Forms vazio ou existente

Este tutorial mostra como adicionar ASP.NET Identity (o novo sistema de associação para ASP.NET) a um aplicativo ASP.NET.

Quando você cria um novo projeto de Web Forms ou MVC no Visual Studio 2017 RTM com contas individuais, o Visual Studio instalará todos os pacotes necessários e adicionará todas as classes necessárias para você. Este tutorial ilustrará as etapas para adicionar o suporte ASP.NET Identity ao seu projeto existente do Web Forms ou a um novo projeto vazio. Descreverei todos os pacotes NuGet necessários para instalar e as classes que você precisa adicionar. Examinarei exemplos de Web Forms para registrar novos usuários e fazer logon, realçando todas as APIs de ponto de entrada principais para gerenciamento e autenticação do usuário. Este exemplo usará a implementação padrão de identidade ASP.NET para o armazenamento de dados SQL que é criado no Entity Framework. Neste tutorial, usaremos o LocalDB para o banco de dados SQL.

Introdução ao ASP.NET Identity

  1. Comece instalando e executando o Visual Studio 2017.

  2. Selecione Novo Projeto na página Iniciar ou você pode usar o menu e selecionar Arquivo e, em seguida, Novo Projeto.

  3. No painel esquerdo, expanda Visual C#e, em seguida, selecione Web e , em seguida, ASP.NET Aplicativo Web (.Net Framework). Nomeie seu projeto como "WebFormsIdentity" e selecione OK.

    Imagem exibindo a criação do novo projeto

  4. Na caixa de diálogo Novo projeto ASP.NET , selecione o modelo Vazio .

    Nova janela de diálogo do projeto A SP dot N E T

    Observe que o botão Alterar Autenticação está desabilitado e nenhum suporte de autenticação é fornecido neste modelo. Os modelos de Web Forms, MVC e API Web permitem que você selecione a abordagem de autenticação.

Adicionar pacotes de identidade ao seu aplicativo

No Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto e selecione Gerenciar Pacotes NuGet. Pesquise e instale o pacote Microsoft.AspNet.Identity.EntityFramework .

Imagem ilustrando como acessar o gerenciamento de pacotes Nu Get

Observe que esse pacote instalará os pacotes de dependência: EntityFramework e Microsoft ASP.NET Identity Core.

Adicionar um formulário da Web para registrar usuários

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto e selecione Adicionar e, em seguida, Formulário Web.

    Imagem mostrando como adicionar um formulário da Web a usuários registrados

  2. Na caixa de diálogo Especificar Nome para Item, nomeie o novo formulário da Web Register e selecione OK

  3. Substitua a marcação no arquivo gerado Register.aspx pelo código abaixo. As alterações de código são realçadas.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Register.aspx.cs" Inherits="WebFormsIdentity.Register" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
        <form id="form1" runat="server">
        <div>
            <h4 style="font-size: medium">Register a new user</h4>
            <hr />
            <p>
                <asp:Literal runat="server" ID="StatusMessage" />
            </p>                
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="UserName" />                
                </div>
            </div>
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="Password" TextMode="Password" />                
                </div>
            </div>
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="ConfirmPassword">Confirm password</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" />                
                </div>
            </div>
            <div>
                <div>
                    <asp:Button runat="server" OnClick="CreateUser_Click" Text="Register" />
                </div>
            </div>
        </div>
        </form>
    </body>
    </html>
    

    Observação

    Esta é apenas uma versão simplificada do arquivo Register.aspx que é criado quando você cria um novo projeto ASP.NET Web Forms. A marcação acima adiciona campos de formulário e um botão para registrar um novo usuário.

  4. Abra o arquivo Register.aspx.cs e substitua o conteúdo do arquivo pelo seguinte código:

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using System;
    using System.Linq;
    
    namespace WebFormsIdentity
    {
       public partial class Register : System.Web.UI.Page
       {
          protected void CreateUser_Click(object sender, EventArgs e)
          {
             // Default UserStore constructor uses the default connection string named: DefaultConnection
             var userStore = new UserStore<IdentityUser>();
             var manager = new UserManager<IdentityUser>(userStore);
    
             var user = new IdentityUser() { UserName = UserName.Text };
             IdentityResult result = manager.Create(user, Password.Text);
    
             if (result.Succeeded)
             {
                StatusMessage.Text = string.Format("User {0} was created successfully!", user.UserName);
             }
             else
             {
                StatusMessage.Text = result.Errors.FirstOrDefault();
             }
          }
       }
    }
    

    Observação

    1. O código acima é uma versão simplificada do arquivo Register.aspx.cs que é criado quando você cria um novo projeto ASP.NET Web Forms.
    2. A classe IdentityUser é a implementação padrão de EntityFramework da interface do IUser . A interface do IUser é a interface mínima para um usuário no ASP.NET Identity Core.
    3. A classe UserStore é a implementação padrão de EntityFramework de um repositório de usuários. Essa classe implementa as interfaces mínimas do ASP.NET Identity Core: IUserStore, IUserLoginStore, IUserClaimStore e IUserRoleStore.
    4. A classe UserManager expõe APIs relacionadas ao usuário que salvarão automaticamente as alterações no UserStore.
    5. A classe IdentityResult representa o resultado de uma operação de identidade.
  5. No Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto e selecione Adicionar, Adicionar ASP.NET Pasta e , em seguida, App_Data.

    Ilustração de como adicionar dados do aplicativo

  6. Abra o arquivo Web.config e adicione uma entrada de cadeia de conexão para o banco de dados que usaremos para armazenar informações do usuário. O banco de dados será criado em runtime pelo EntityFramework para as entidades de identidade. A cadeia de conexão é semelhante à criada para você ao criar um novo projeto do Web Forms. O código realçado mostra a marcação que você deve adicionar:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      https://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit https://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
       <connectionStrings>
          <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\WebFormsIdentity.mdf;Initial Catalog=WebFormsIdentity;Integrated Security=True"
                providerName="System.Data.SqlClient" />
       </connectionStrings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>
    </configuration>
    

    Observação

    Para o Visual Studio 2015 ou superior, substitua (localdb)\v11.0(localdb)\MSSQLLocalDB na cadeia de conexão.

  7. Clique com o botão direito do mouse no arquivo Register.aspx em seu projeto e selecione Definir como Página Inicial. Pressione Ctrl + F5 para compilar e executar o aplicativo Web. Insira um novo nome de usuário e senha e selecione Registrar.

    Imagem de novo registro de usuário bem-sucedido

    Observação

    ASP.NET Identity tem suporte para validação e, neste exemplo, você pode verificar o comportamento padrão em validadores de usuário e senha provenientes do pacote identity core. O validador padrão para Usuário (UserValidator) tem uma propriedade AllowOnlyAlphanumericUserNames que tem o valor padrão definido como true. O validador padrão de Senha (MinimumLengthValidator) garante que a senha tenha pelo menos 6 caracteres. Esses validadores são propriedades em UserManager que podem ser substituídas se você quiser ter uma validação personalizada.

Verificar o banco de dados de identidade localDb e as tabelas geradas pelo Entity Framework

  1. No menu Exibir , selecione Gerenciador de Servidores.

    Imagem de como acessar o gerenciador de servidores

  2. Expanda DefaultConnection (WebFormsIdentity), expanda Tabelas, clique com o botão direito do mouse em AspNetUsers e selecione Mostrar Dados da Tabela.

    Imagem de como acessar mostrar dados da tabela
    Imagem exibindo dados de tabela de usuários registrados

Configurar o aplicativo para autenticação OWIN

Neste ponto, só adicionamos suporte para a criação de usuários. Agora, vamos demonstrar como podemos adicionar autenticação para fazer logon de um usuário. ASP.NET Identity usa o middleware de Autenticação OWIN da Microsoft para autenticação de formulários. A Autenticação de Cookie OWIN é um mecanismo de autenticação baseado em cookie e declarações que pode ser usado por qualquer estrutura hospedada no OWIN ou IIS. Com esse modelo, os mesmos pacotes de autenticação podem ser usados em várias estruturas, incluindo ASP.NET MVC e Web Forms. Para obter mais informações sobre o projeto Katana e como executar middleware em um host independente, consulte Introdução ao Projeto Katana.

Instalar pacotes de autenticação em seu aplicativo

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto e selecione Gerenciar Pacotes NuGet. Pesquise e instale o pacote Microsoft.AspNet.Identity.Owin .

    Imagem do gerenciador de pacotes Nu Get

  2. Pesquise e instale o pacote Microsoft.Owin.Host.SystemWeb .

    Observação

    O pacote Microsoft.Aspnet.Identity.Owin contém um conjunto de classes de extensão OWIN para gerenciar e configurar o middleware de autenticação OWIN a ser consumido por pacotes ASP.NET Identity Core. O pacote Microsoft.Owin.Host.SystemWeb contém um servidor OWIN que permite que aplicativos baseados em OWIN sejam executados no IIS usando o pipeline de solicitação ASP.NET. Para obter mais informações , consulte OWIN Middleware no pipeline integrado do IIS.

Adicionar classes de configuração de inicialização e autenticação OWIN

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto, selecione Adicionar e, em seguida, Adicione Novo Item. Na caixa de diálogo de texto de pesquisa, digite "owin". Nomeie a classe "Inicialização" e selecione Adicionar.

    Imagem da janela adicionar novo item

  2. No arquivo Startup.cs, adicione o código realçado mostrado abaixo para configurar a autenticação de cookie OWIN.

    using Microsoft.AspNet.Identity;
    using Microsoft.Owin;
    using Microsoft.Owin.Security.Cookies;
    using Owin;
    
    [assembly: OwinStartup(typeof(WebFormsIdentity.Startup))]
    
    namespace WebFormsIdentity
    {
       public class Startup
       {
          public void Configuration(IAppBuilder app)
          {
             // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888
             app.UseCookieAuthentication(new CookieAuthenticationOptions
             {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Login")
             });
          }
       }
    }
    

    Observação

    Essa classe contém o OwinStartup atributo para especificar a classe de inicialização OWIN. Cada aplicativo OWIN tem uma classe de inicialização em que você especifica componentes para o pipeline de aplicativos. Consulte a Detecção de Classe de Inicialização OWIN para obter mais informações sobre esse modelo.

Adicionar formulários web para registrar e fazer login de usuários

  1. Abra o arquivo Register.aspx.cs e adicione o código a seguir que entra no usuário quando o registro for bem-sucedido.

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using System;
    using System.Linq;
    using System.Web;
    
    namespace WebFormsIdentity
    {
       public partial class Register : System.Web.UI.Page
       {
          protected void CreateUser_Click(object sender, EventArgs e)
          {
             // Default UserStore constructor uses the default connection string named: DefaultConnection
             var userStore = new UserStore<IdentityUser>();
             var manager = new UserManager<IdentityUser>(userStore);
             var user = new IdentityUser() { UserName = UserName.Text };
    
             IdentityResult result = manager.Create(user, Password.Text);
    
             if (result.Succeeded)
             {
                var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                var userIdentity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
                authenticationManager.SignIn(new AuthenticationProperties() { }, userIdentity);
                Response.Redirect("~/Login.aspx");
             }
             else
             {
                StatusMessage.Text = result.Errors.FirstOrDefault();
             }
          }
       }
    }
    

    Observação

    • Como o ASP.NET Identity e a Autenticação de Cookie do OWIN são sistemas baseados em declarações, a estrutura exige que o desenvolvedor do aplicativo gere uma ClaimsIdentity para o usuário. ClaimsIdentity tem informações sobre todas as declarações para o usuário, como a quais funções o usuário pertence. Você também pode adicionar mais declarações para o usuário neste estágio.
    • Você pode entrar no usuário usando o AuthenticationManager do OWIN e chamando SignIn e passando a ClaimsIdentity, conforme mostrado acima. Esse código conectará o usuário e gerará um cookie também. Essa chamada é análoga a FormAuthentication.SetAuthCookie usada pelo módulo FormsAuthentication .
  2. No Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto, selecione Adicionar e, em seguida, Formulário web. Nomeie o formulário web Login.

    Imagem adicionando um novo formulário da Web

  3. Substitua o conteúdo do arquivo Login.aspx pelo seguinte código:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="WebFormsIdentity.Login" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
       <title></title>
    </head>
    <body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
       <form id="form1" runat="server">
          <div>
             <h4 style="font-size: medium">Log In</h4>
             <hr />
             <asp:PlaceHolder runat="server" ID="LoginStatus" Visible="false">
                <p>
                   <asp:Literal runat="server" ID="StatusText" />
                </p>
             </asp:PlaceHolder>
             <asp:PlaceHolder runat="server" ID="LoginForm" Visible="false">
                <div style="margin-bottom: 10px">
                   <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
                   <div>
                      <asp:TextBox runat="server" ID="UserName" />
                   </div>
                </div>
                <div style="margin-bottom: 10px">
                   <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
                   <div>
                      <asp:TextBox runat="server" ID="Password" TextMode="Password" />
                   </div>
                </div>
                <div style="margin-bottom: 10px">
                   <div>
                      <asp:Button runat="server" OnClick="SignIn" Text="Log in" />
                   </div>
                </div>
             </asp:PlaceHolder>
             <asp:PlaceHolder runat="server" ID="LogoutButton" Visible="false">
                <div>
                   <div>
                      <asp:Button runat="server" OnClick="SignOut" Text="Log out" />
                   </div>
                </div>
             </asp:PlaceHolder>
          </div>
       </form>
    </body>
    </html>
    
  4. Substitua o conteúdo do arquivo Login.aspx.cs pelo seguinte:

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using System;
    using System.Web;
    using System.Web.UI.WebControls;
    
    namespace WebFormsIdentity
    {
       public partial class Login : System.Web.UI.Page
       {
          protected void Page_Load(object sender, EventArgs e)
          {
             if (!IsPostBack)
             {
                if (User.Identity.IsAuthenticated)
                {
                   StatusText.Text = string.Format("Hello {0}!!", User.Identity.GetUserName());
                   LoginStatus.Visible = true;
                   LogoutButton.Visible = true;
                }
                else
                {
                   LoginForm.Visible = true;
                }
             }
          }
    
          protected void SignIn(object sender, EventArgs e)
          {
             var userStore = new UserStore<IdentityUser>();
             var userManager = new UserManager<IdentityUser>(userStore);
             var user = userManager.Find(UserName.Text, Password.Text);
    
             if (user != null)
             {
                var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                var userIdentity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
    
                authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, userIdentity);
                Response.Redirect("~/Login.aspx");
             }
             else
             {
                StatusText.Text = "Invalid username or password.";
                LoginStatus.Visible = true;
             }
          }
    
          protected void SignOut(object sender, EventArgs e)
          {
             var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
             authenticationManager.SignOut();
             Response.Redirect("~/Login.aspx");
          }
       }
    }
    

    Observação

    • Agora, Page_Load verifica o status do usuário atual e toma ações com base no status dele de Context.User.Identity.IsAuthenticated. Exibir o nome de usuário conectado : o Microsoft ASP.NET Identity Framework adicionou métodos de extensão em System.Security.Principal.IIdentity que permite que você obtenha o UserName e UserId para o usuário conectado. Esses métodos de extensão são definidos no Microsoft.AspNet.Identity.Core assembly. Esses métodos de extensão são o substituto para HttpContext.User.Identity.Name.
    • Método SignIn: This substitui o método anterior CreateUser_Click neste exemplo e agora faz o login do usuário após a criação bem-sucedida do usuário.
      O Microsoft OWIN Framework adicionou métodos System.Web.HttpContext de extensão que permitem que você obtenha uma referência a um IOwinContext. Esses métodos de extensão são definidos no Microsoft.Owin.Host.SystemWeb assembly. A OwinContext classe expõe uma IAuthenticationManager propriedade que representa a funcionalidade do middleware de autenticação disponível na requisição atual. Você pode autenticar o usuário usando o AuthenticationManager do OWIN e chamando o SignIn, passando o ClaimsIdentity conforme mostrado acima. Como o ASP.NET Identity e a OWIN Cookie Authentication são um sistema baseado em declarações, a estrutura exige que o aplicativo gere um ClaimsIdentity para o usuário. Ele ClaimsIdentity tem informações sobre todas as atribuições do usuário, como as funções às quais ele pertence. Você também pode adicionar mais declarações para o usuário neste estágio. Esse código também entrará no usuário e gerará um cookie. Essa chamada é análoga a FormAuthentication.SetAuthCookie usada pelo módulo FormsAuthentication .
    • SignOut método: obtém uma referência a AuthenticationManager do OWIN e chama SignOut. Isso é análogo ao método FormsAuthentication.SignOut usado pelo módulo FormsAuthentication .
  5. Pressione Ctrl + F5 para compilar e executar o aplicativo Web. Insira um novo nome de usuário e senha e selecione Registrar.

    Imagem do registro de novo usuário
    Observação: neste ponto, o novo usuário é criado e conectado.

  6. Selecione o botão Sair . Você é redirecionado para o formulário de logon.

  7. Insira um nome de usuário ou senha inválido e selecione o botão Fazer logon . O UserManager.Find método retornará nulo e a mensagem de erro: " Nome de usuário ou senha inválido " será exibido.

    Imagem da tentativa de logon inválida