Partilhar via


Introdução à identidade ASP.NET

O sistema de associação ASP.NET foi introduzido com a ASP.NET 2.0 em 2005 e, desde então, houve muitas mudanças na maneira como os aplicativos da Web normalmente lidam com autenticação e autorização. ASP.NET Identity é um novo olhar sobre o que o sistema de associação deve ser quando você está criando aplicativos modernos para a web, telefone ou tablet.

Recomendamos o uso da opção de autenticação segura mais segura. Para aplicativos .NET implantados no Azure, consulte:

O Azure Key Vault e .NET Aspire fornecem a maneira mais segura de armazenar e recuperar segredos. O Azure Key Vault é um serviço de nuvem que protege chaves de criptografia e segredos como certificados, cadeias de conexão e senhas. Para o .NET Aspire, consulte Comunicação segura entre hospedagem e integrações de cliente.

Evite a concessão de credenciais de senha do proprietário do recurso porque:

  • Expõe a senha do usuário para o cliente.
  • É um risco de segurança significativo.
  • Só deve ser usado quando outros fluxos de autenticação não são possíveis.

Quando o aplicativo é implantado em um servidor de teste, uma variável de ambiente pode ser usada para definir a cadeia de conexão para um servidor de banco de dados de teste. As variáveis de ambiente geralmente são armazenadas em texto simples e não criptografado. Se a máquina ou o processo estiver comprometido, as variáveis de ambiente podem ser acessadas por partes não confiáveis. Recomendamos não usar variáveis de ambiente para armazenar uma cadeia de conexão de produção, pois não é a abordagem mais segura.

Diretrizes de dados de configuração:

  • Nunca armazene senhas ou outros dados confidenciais no código do provedor de configuração ou em arquivos de configuração de texto simples.
  • Não use segredos de produção em ambientes de desenvolvimento ou teste.
  • Especifique segredos fora do projeto para que eles não possam ser acidentalmente comprometidos em um repositório de código-fonte.

Antecedentes: Filiação em ASP.NET

ASP.NET Filiação

ASP.NET Membership foi concebido para resolver os requisitos de associação do site que eram comuns em 2005, envolvendo Forms Authentication e um banco de dados SQL Server para nomes de utilizador, senhas e dados de perfil. Hoje há uma gama 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 autenticação e funcionalidade de autorização. As limitações do design da associação ASP.NET dificultam essa transição:

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

ASP.NET Adesão Simples

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

A Simple Membership facilitou a personalização das informações do perfil de utilizador, mas ainda compartilha os outros problemas com o Membership do ASP.NET e tem algumas limitações.

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

ASP.NET Provedores Universais

ASP.NET Provedores Universais foram desenvolvidos para possibilitar a persistência de informações de associação no Banco de Dados SQL do Microsoft Azure e também funcionam com o SQL Server Compact. Os Provedores Universais foram criados com base no Entity Framework Code First, o que significa que os Provedores Universais podem ser usados para persistir dados em qualquer armazenamento suportado pelo EF. Com os Provedores Universais, o esquema do banco de dados também foi bastante limpo.

Os provedores universais são construídos na infraestrutura de associação ASP.NET, portanto, eles ainda carregam 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 usuário. Esses provedores também ainda usam a Autenticação de Formulários para a funcionalidade de entrada e saída.

ASP.NET Identidade

À medida que a história de associação na ASP.NET evoluiu ao longo dos anos, a equipe ASP.NET aprendeu muito com o feedback dos clientes.

A suposição de que os usuários entrarão digitando um nome de usuário e 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 uns com os outros em tempo real através 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 rica em seus sites. Um sistema de associação moderno deve permitir logins baseados em redirecionamento para provedores de autenticação como Facebook, Twitter e outros.

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

Considerando estas mudanças no desenvolvimento de aplicações web, ASP.NET Identity foi desenvolvido com os seguintes objetivos:

  • Sistema One ASP.NET Identity

    • ASP.NET Identity pode ser usado com todas as estruturas ASP.NET, como ASP.NET MVC, Web Forms, Web Pages, Web API e SignalR.
    • ASP.NET Identidade pode ser usada quando você estiver criando aplicativos da Web, telefone, 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.
  • Controlo 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 seu mecanismo de persistência.
    • Como você controla o esquema do banco de dados, tarefas comuns, como alterar nomes de tabelas ou alterar o tipo de dados de chaves primárias, são simples de fazer.
    • É fácil integrar diferentes mecanismos de armazenamento, como o SharePoint, o Serviço de Tabela de Armazenamento do Azure, e bancos de dados NoSQL, etc., sem ter que lançar exceções System.NotImplementedExceptions.
  • Teste de testabilidade unitária

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

    • Há um provedor de função que permite restringir o acesso a partes do seu aplicativo por funções. Você pode facilmente criar funções como "Admin" e adicionar usuários a funções.
  • Reclamações Baseadas

    • ASP.NET Identity oferece suporte à autenticação baseada em declarações, onde a identidade do usuário é representada como um conjunto de declarações. As declarações permitem que os desenvolvedores sejam muito mais expressivos na descrição da identidade de um usuário do que as funções permitem. Enquanto ser membro de uma função é apenas um booleano (membro ou não-membro), uma declaração pode incluir informações detalhadas sobre a identidade e o grau de adesão do utilizador.
  • Provedores de login social

    • Você pode facilmente adicionar logins 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

    • A autenticação do ASP.NET baseia-se agora no middleware OWIN, que pode ser utilizado em qualquer host que suporte OWIN. ASP.NET Identity não tem qualquer dependência de 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 login/logout de usuários no site. Isso significa que, em vez de usar FormsAuthentication para gerar o cookie, o aplicativo usa OWIN CookieAuthentication para fazer isso.
  • pacote NuGet

    • ASP.NET Identity é redistribuído como um pacote NuGet que é instalado nos modelos MVC ASP.NET, Web Forms e API Web fornecidos com o Visual Studio 2017. Você pode baixar este pacote NuGet da galeria NuGet.
    • O lançamento do ASP.NET Identity como um pacote NuGet torna mais fácil para a equipe de ASP.NET iterar 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, Web API e SPA. Neste passo a passo, ilustraremos como os modelos de projeto usam o ASP.NET Identity para adicionar funcionalidade para registrar, entrar e sair de um usuário.

ASP.NET Identidade é implementada usando o procedimento a seguir. O objetivo deste artigo é dar-lhe uma visão geral de alto nível da ASP.NET Identidade; Você pode segui-lo passo a passo ou apenas ler os detalhes. Para obter instruções mais detalhadas sobre como criar aplicativos usando o 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, Web API, 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
      Este pacote contém a implementação do Entity Framework do ASP.NET Identity, que armazenará os dados e o esquema do ASP.NET Identity no SQL Server.
    • Microsoft.AspNet.Identity.Core
      Este pacote tem as interfaces principais para ASP.NET Identity. Este pacote pode ser usado para escrever uma implementação para ASP.NET Identity que tenha como alvo diferentes armazenamentos de persistência, como o Armazenamento de Tabela do Azure, bancos de dados NoSQL, etc.
    • Microsoft.AspNet.Identity.OWIN
      Este pacote contém a funcionalidade que é usada para conectar a autenticação OWIN com ASP.NET Identity em aplicativos ASP.NET. Isso é usado quando você adiciona a funcionalidade de login ao seu aplicativo e chama o middleware OWIN Cookie Authentication para gerar um cookie.
  3. Criando um usuário.
    Inicie o aplicativo e, em seguida, clique no link Registrar para criar um usuário. A imagem seguinte mostra a página Registar que recolhe o nome de utilizador e a palavra-passe.

    Imagem de criação de 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 ASP.NET, conforme destacado 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. Iniciar sessão.
    Se a utilizadora foi criada com êxito, ela é conectada pelo método SignInAsync.

     [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 método SignInManager.SignInAsync gera um ClaimsIdentity. Como ASP.NET Identity e OWIN Cookie Authentication são sistemas baseados em declarações, a estrutura exige que o aplicativo gere uma ClaimsIdentity para o usuário. ClaimsIdentity tem informações sobre todas as reivindicações para o utilizador, como a que funções o utilizador pertence.

  5. Terminar sessão.
    Selecione o link Terminar sessão para chamar a ação Terminar sessão no controlador de contas.

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

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

Componentes da identidade ASP.NET

O diagrama abaixo mostra os componentes do sistema ASP.NET Identity (selecione em este ou no diagrama para ampliá-lo). As embalagens em verde compõem o sistema ASP.NET Identity. Todos os outros pacotes são dependências que são necessárias para usar o sistema ASP.NET Identity em aplicativos ASP.NET.

Diagrama mostrando os componentes do sistema de identidade A S P dot Net

A seguir está uma breve descrição dos pacotes NuGet não mencionados anteriormente:

  • Microsoft.Owin.Security.Cookies
    Middleware que permite que uma aplicação use autenticação baseada em cookies, semelhante à autenticação de formulários ASP.NET.
  • EntityFramework
    O Entity Framework é a tecnologia de acesso a dados recomendada pela Microsoft para bancos de dados relacionais.

Migrando de Membership para ASP.NET Identity

Esperamos em breve fornecer orientação sobre como migrar seus aplicativos existentes que usam ASP.NET Membership ou Simple Membership para o novo sistema ASP.NET Identity.

Próximos passos