Introdução à Identidade do ASP.NET

O sistema de associação ASP.NET foi introduzido com o ASP.NET 2.0 em 2005 e, desde então, houve muitas alterações nas maneiras como os aplicativos Web normalmente lidam com autenticação e autorização. ASP.NET Identity é uma nova olhada no que o sistema de associação deve ser quando você está criando aplicativos modernos para a Web, telefone ou tablet.

Plano de fundo: associação em ASP.NET

Associação do ASP.NET

ASP.NET Associação foi projetada para resolver os requisitos de associação de site que eram comuns em 2005, que envolviam a Autenticação de Formulários e um banco de dados SQL Server para nomes de usuário, senhas e dados de perfil. Hoje há uma matriz muito mais ampla de opções de armazenamento de dados para aplicativos Web, e a maioria dos desenvolvedores deseja permitir que seus sites usem provedores de identidade social para funcionalidade de autenticação e autorização. As limitações do design da Associação de ASP.NET dificultam essa transição:

  • O esquema de banco de dados foi projetado para SQL Server e você não pode alterá-lo. Você pode adicionar informações de perfil, mas os dados adicionais são empacotados em uma tabela diferente, o que dificulta o acesso por qualquer meio, exceto por meio da API do Provedor de Perfil.
  • O sistema de provedor permite que você altere o armazenamento de dados de backup, mas o sistema foi projetado em torno de suposições apropriadas para um banco de dados relacional. Você pode escrever um provedor para armazenar informações de associação em um mecanismo de armazenamento não relacional, como Tabelas de Armazenamento do Azure, mas, em seguida, você precisa contornar o design relacional escrevendo muito código e muitas System.NotImplementedException exceções para métodos que não se aplicam a bancos de dados NoSQL.
  • Como a funcionalidade de logon/logoff é baseada na Autenticação de Formulários, o sistema de associação não pode usar o OWIN. O OWIN inclui componentes de middleware para autenticação, incluindo suporte para logons usando provedores de identidade externos (como Contas da Microsoft, Facebook, Google, Twitter) e logons usando contas organizacionais do Active Directory local ou do Azure Active Directory. O OWIN também inclui suporte para OAuth 2.0, JWT e CORS.

ASP.NET associação simples

ASP.NET associação simples foi desenvolvida como um sistema de associação para Páginas da Web do ASP.NET. Ele foi lançado com o WebMatrix e o Visual Studio 2010 SP1. O objetivo da Associação Simples era facilitar a adição da funcionalidade de associação a um aplicativo de Páginas da Web.

A Associação Simples facilitou a personalização das informações de perfil do usuário, mas ainda compartilha os outros problemas com a Associação ASP.NET e tem algumas limitações:

  • Era difícil persistir dados do sistema de associação em um repositório não relacional.
  • Não é possível usá-lo com o OWIN.
  • Ele não funciona bem com provedores de associação ASP.NET existentes e não é extensível.

Provedores Universais ASP.NET

Provedores Universais ASP.NET foram desenvolvidos para possibilitar a persistência de informações de associação em Banco de Dados SQL do Microsoft Azure e também trabalham com SQL Server Compact. Os Provedores Universais foram criados no Entity Framework Code First, o que significa que o Provedores Universais pode ser usado para persistir dados em qualquer repositório com suporte do EF. Com o Provedores Universais, o esquema de banco de dados também foi limpo bastante.

As Provedores Universais são criadas na infraestrutura de Associação do ASP.NET, portanto, elas ainda têm as mesmas limitações que o Provedor sqlMembership. Ou seja, eles foram projetados para bancos de dados relacionais e é difícil personalizar informações de perfil e de usuário. Esses provedores também ainda usam a Autenticação de Formulários para funcionalidade de entrada e saída.

ASP.NET Identity

À medida que a história de associação em ASP.NET evoluiu ao longo dos anos, a equipe de ASP.NET aprendeu muito com os comentários dos clientes.

A suposição de que os usuários entrarão inserindo um nome de usuário e uma senha que eles registraram em seu próprio aplicativo não é mais válida. A web tornou-se mais social. Os usuários estão interagindo entre si em tempo real por meio de canais sociais como Facebook, Twitter e outros sites sociais. Os desenvolvedores querem que os usuários possam entrar com suas identidades sociais para que possam ter uma experiência avançada em seus sites. Um sistema de associação moderno deve habilitar logons baseados em redirecionamento para provedores de autenticação, como Facebook, Twitter e outros.

À medida que o desenvolvimento para a Web evoluiu, os padrões de desenvolvimento para a Web também evoluíram. O teste de unidade do código do aplicativo tornou-se uma preocupação fundamental para os desenvolvedores de aplicativos. Em 2008, ASP.NET adicionou uma nova estrutura com base no padrão MVC (Model-View-Controller), em parte para ajudar os desenvolvedores a criar aplicativos testáveis por unidade ASP.NET. Os desenvolvedores que queriam testar a unidade da lógica do aplicativo também queriam poder fazer isso com o sistema de associação.

Considerando essas alterações no desenvolvimento de aplicativos Web, ASP.NET Identity foi desenvolvido com as seguintes metas:

  • Sistema de identidade de um ASP.NET

    • ASP.NET Identity pode ser usada com todas as estruturas de ASP.NET, como ASP.NET MVC, Web Forms, Páginas da Web, API Web e SignalR.
    • ASP.NET Identity pode ser usada ao criar aplicativos Web, de telefone, de loja ou híbridos.
  • Facilidade de conectar dados de perfil sobre o usuário

    • Você tem controle sobre o esquema de informações de usuário e perfil. Por exemplo, você pode facilmente habilitar o sistema para armazenar datas de nascimento inseridas pelos usuários quando eles registram uma conta em seu aplicativo.
  • Controle de persistência

    • Por padrão, o sistema ASP.NET Identity armazena todas as informações do usuário em um banco de dados. ASP.NET Identity usa o Entity Framework Code First para implementar todo o mecanismo de persistência.
    • Como você controla o esquema de banco de dados, tarefas comuns, como alterar nomes de tabela ou alterar o tipo de dados de chaves primárias, são simples de fazer.
    • É fácil conectar diferentes mecanismos de armazenamento, como SharePoint, Serviço de Tabela de Armazenamento do Azure, bancos de dados NoSQL etc., sem precisar gerar System.NotImplementedExceptions exceções.
  • Testabilidade de unidade

    • ASP.NET Identity torna o aplicativo Web mais testável por unidade. Você pode escrever testes de unidade para as partes do aplicativo que usam ASP.NET Identity.
  • Provedor de função

    • Há um provedor de função que permite restringir o acesso a partes do aplicativo por funções. Você pode criar facilmente funções como "Administração" e adicionar usuários a funções.
  • Com base em declarações

    • ASP.NET Identity dá suporte à autenticação baseada em declarações, em que a identidade do usuário é representada como um conjunto de declarações. As declarações permitem que os desenvolvedores sejam muito mais expressivos ao descrever a identidade de um usuário do que as funções permitem. Enquanto a associação de função é apenas um booliano (membro ou não membro), uma declaração pode incluir informações avançadas sobre a identidade e a associação do usuário.
  • Provedores de Logon Social

    • Você pode adicionar facilmente logons sociais, como Conta da Microsoft, Facebook, Twitter, Google e outros ao seu aplicativo, e armazenar os dados específicos do usuário em seu aplicativo.
  • Integração OWIN

    • ASP.NET autenticação agora é baseada no middleware OWIN que pode ser usado em qualquer host baseado em OWIN. ASP.NET Identity não tem nenhuma dependência no System.Web. É uma estrutura OWIN totalmente compatível e pode ser usada em qualquer aplicativo hospedado OWIN.
    • ASP.NET Identity usa a Autenticação OWIN para fazer logon/logoff de usuários no site. Isso significa que, em vez de usar FormsAuthentication para gerar o cookie, o aplicativo usa CookieAuthentication OWIN para fazer isso.
  • Pacote NuGet

    • ASP.NET Identity é redistribuída como um pacote NuGet instalado no ASP.NET MVC, Web Forms e modelos de API Web fornecidos com o Visual Studio 2017. Você pode baixar esse pacote NuGet na galeria do NuGet.
    • A liberação de ASP.NET Identity como um pacote NuGet torna mais fácil para a equipe de ASP.NET iterar em novos recursos e correções de bugs e entregá-los aos desenvolvedores de maneira ágil.

Introdução ao ASP.NET Identity

ASP.NET Identity é usada nos modelos de projeto do Visual Studio 2017 para ASP.NET MVC, Web Forms, API Web e SPA. Neste passo a passo, ilustraremos como os modelos de projeto usam ASP.NET Identity para adicionar funcionalidade para registrar, entrar e desconscreve um usuário.

ASP.NET Identity é implementado usando o procedimento a seguir. A finalidade deste artigo é fornecer uma visão geral de alto nível do ASP.NET Identity; você pode segui-lo passo a passo ou apenas ler os detalhes. Para obter instruções mais detalhadas sobre como criar aplicativos usando ASP.NET Identity, incluindo o uso da nova API para adicionar usuários, funções e informações de perfil, consulte a seção Próximas Etapas no final deste artigo.

  1. Crie um aplicativo MVC ASP.NET com Contas Individuais. Você pode usar ASP.NET Identity em ASP.NET MVC, Web Forms, API Web, SignalR etc. Neste artigo, começaremos com um aplicativo MVC ASP.NET.

    Imagem da nova janela do projeto ASP dot Net

  2. O projeto criado contém os três pacotes a seguir para ASP.NET Identity.

    • Microsoft.AspNet.Identity.EntityFramework
      Esse pacote tem a implementação do Entity Framework de ASP.NET Identity, que persistirá os dados e o esquema de identidade do ASP.NET para SQL Server.
    • Microsoft.AspNet.Identity.Core
      Esse pacote tem as principais interfaces para ASP.NET Identity. Esse pacote pode ser usado para gravar uma implementação para ASP.NET Identity que tem como destino diferentes repositórios de persistência, como Armazenamento de Tabelas do Azure, bancos de dados NoSQL etc.
    • Microsoft.AspNet.Identity.OWIN
      Esse pacote contém a funcionalidade usada para conectar a autenticação OWIN ao ASP.NET Identity em aplicativos ASP.NET. Isso é usado quando você adiciona a funcionalidade de entrada ao seu aplicativo e chama o middleware de Autenticação de Cookie OWIN para gerar um cookie.
  3. Criar um usuário.
    Inicie o aplicativo e clique no link Registrar para criar um usuário. A imagem a seguir mostra a página Registrar que coleta o nome de usuário e a senha.

    Imagem da criação de uma nova conta

    Quando o usuário seleciona o botão Registrar , a ação Register do controlador de conta cria o usuário chamando a API de identidade do ASP.NET, conforme realçado abaixo:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  4. Entrar.
    Se o usuário tiver sido criado com êxito, ele será conectado pelo SignInAsync método .

     [HttpPost]
     [AllowAnonymous]
     [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                 await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                        
                 // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                 // Send an email with this link
                 // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                 // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                 // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
    
                 return RedirectToAction("Index", "Home");
             }
             AddErrors(result);
         }
    
        // If we got this far, something failed, redisplay form
         return View(model);
     }
    

    O SignInManager.SignInAsync método gera uma ClaimsIdentity. Como ASP.NET Identity e a Autenticação de Cookie OWIN são um sistema baseado em declarações, a estrutura exige que o 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.

  5. Dê logoff.
    Selecione o link Fazer logoff para chamar a ação LogOff no controlador da conta.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    O código realçado acima mostra o método OWIN AuthenticationManager.SignOut . Isso é análogo ao método FormsAuthentication.SignOut usado pelo módulo FormsAuthentication no Web Forms.

Componentes do ASP.NET Identity

O diagrama a seguir mostra os componentes do sistema ASP.NET Identity (selecione neste ou no diagrama para ampliá-lo). Os pacotes em verde compõem o sistema de identidade do ASP.NET. Todos os outros pacotes são dependências necessárias para usar o sistema de identidade ASP.NET em aplicativos ASP.NET.

Diagrama mostrando os componentes do sistema de identidade A SP dot Net

Veja a seguir uma breve descrição dos pacotes NuGet não mencionados anteriormente:

  • Microsoft.Owin.Security.Cookies
    Middleware que permite que um aplicativo use a autenticação baseada em cookie, semelhante ao ASP. Autenticação de Formulários do NET.
  • EntityFramework
    O Entity Framework é a tecnologia de acesso a dados recomendada pela Microsoft para bancos de dados relacionais.

Migrando da Associação para a Identidade do ASP.NET

Esperamos fornecer em breve diretrizes sobre como migrar seus aplicativos existentes que usam Associação ASP.NET ou Associação Simples para o novo sistema de identidade de ASP.NET.

Próximas etapas