Introdução à Identidade do ASP.NET
O sistema de associação ASP.NET foi introduzido com ASP.NET 2.0 em 2005 e, desde então, houve muitas alterações nas maneiras pelas quais 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.
É recomendável usar a 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 .NET Aspire, consulte Comunicação segura entre hospedagem e integrações de cliente.
Evite a concessão de credenciais de senha de proprietário do recurso porque ela:
- Expõe a senha do usuário ao cliente.
- É um risco de segurança significativo.
- Só deve ser usado quando outros fluxos de autenticação não forem 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 sem criptografia. Se o computador ou o processo estiver comprometido, as variáveis de ambiente poderão ser acessadas por partes não confiáveis. É recomendável não usar variáveis de ambiente para armazenar uma cadeia de conexão de produção, pois ela 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 sem formatação.
- 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 confirmados em um repositório de código-fonte.
Tela de fundo: associação em ASP.NET
Associação ASP.NET
ASP.NET Membership foi projetado para resolver requisitos de associação de sites comuns em 2005, envolvendo 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 o 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 repositório 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 tabelas de armazenamento do Azure, mas, em seguida, você 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 utilizando provedores de identidade externos (como Contas da Microsoft, Facebook, Google, Twitter) e logins utilizando contas organizacionais do Active Directory local ou do Azure Active Directory. O OWIN também inclui suporte para OAuth 2.0, JWT e CORS.
Associação simples do ASP.NET
Associação simples do ASP.NET foi desenvolvida como um sistema de associação para páginas da Web ASP.NET. Ele foi lançado com o WebMatrix e o Visual Studio 2010 SP1. O objetivo do Simple Membership era facilitar a adição da funcionalidade de adesão a um aplicativo de páginas 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.
- Você não pode 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
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 em Entity Framework Code First, o que significa que os Provedores Universais podem ser usados para persistir dados em qualquer repositório com suporte pelo EF. Com os Provedores Universais, o esquema de banco de dados também foi limpo bastante.
Os Provedores Universais são criados na infraestrutura de associação ASP.NET, portanto, eles ainda têm as mesmas limitações que o Provedor de 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.
Identidade do ASP.NET
À 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 moderno de gerenciamento de membros deve permitir logins baseados em redirecionamento a provedores de autenticação, como Facebook, Twitter e outros.
À medida que o desenvolvimento na Web evoluiu, os padrões de desenvolvimento na Web também evoluíram. O teste de unidade do código do aplicativo tornou-se uma preocupação principal 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 de 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 ASP.NET único
- ASP.NET Identidade pode ser usada com todas as estruturas ASP.NET, como ASP.NET MVC, Web Forms, Páginas da Web, API Web e SignalR.
- ASP.NET Identidade pode ser usada ao criar aplicativos Web, telefone, repositório 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 habilitar facilmente o sistema para armazenar as datas de nascimento inseridas pelos usuários quando eles registram uma conta em seu aplicativo.
Persistência de controles
- 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 exceções
System.NotImplementedExceptions
.
Capacidade de teste da 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ções
- Há um provedor de funções que permite restringir o acesso a partes do aplicativo por funções. Você pode criar facilmente funções como "Administrador" e adicionar usuários a funções.
Baseado 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 na descrição da identidade de um usuário do que as funções permitem. Enquanto a associação à função é apenas um boolean (membro ou não membro), uma reivindicação pode incluir informações detalhadas sobre a identidade e a associação do usuário.
Provedores de Login Social
- Você pode adicionar facilmente logins sociais, como Conta da Microsoft, Facebook, Twitter, Google e outros, ao seu aplicativo e armazenar os dados específicos de cada usuário no aplicativo.
Integração OWIN
- A autenticação ASP.NET 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 o logon/logoff 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, instalado nos modelos de ASP.NET MVC, Web Forms e Web API, disponíveis no Visual Studio 2017. Você pode baixar esse pacote NuGet na galeria do NuGet.
- A liberação do ASP.NET Identity como um pacote NuGet facilita para a equipe do ASP.NET trabalhar em novos recursos e correções de bugs, entregando-os aos desenvolvedores de maneira ágil.
Introdução ao ASP.NET Identity
ASP.NET Identity é usado 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 desconectar 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.
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.
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 do ASP.NET Identity, que persistirá os dados e o esquema do ASP.NET Identity no SQL Server.Microsoft.AspNet.Identity.Core
Esse pacote tem as interfaces principais do ASP.NET Identity. Esse pacote pode ser usado para gravar uma implementação para ASP.NET Identity que tem como destino repositórios de persistência diferentes, 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 com 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.
Criando 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.Quando o usuário seleciona o botão Registrar, a ação
Register
do controlador conta cria o usuário chamando a API de Identidade 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); }
Entrar.
Se a usuária tiver sido criada com êxito, ela será logada pelo métodoSignInAsync
.[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 a Autenticação de Cookie OWIN são um sistema baseado em declarações, a estrutura requer que o aplicativo gere uma ClaimsIdentity para o usuário. O ClaimsIdentity tem informações sobre todas as reivindicações do usuário, como as funções às quais o usuário pertence.Dê logoff.
Selecione o link Log off para chamar a ação LogOff no controlador de 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
AuthenticationManager.SignOut
OWIN. Isso é análogo ao método FormsAuthentication.SignOut usado pelo módulo FormsAuthentication nos Formulários da Web.
Componentes do ASP.NET Identity
O diagrama a seguir mostra os componentes do sistema de identidade ASP.NET (selecione neste ou no diagrama para ampliá-lo). Os pacotes em verde compõem o sistema ASP.NET Identity. Todos os outros pacotes são dependências necessárias para usar o sistema de identidade ASP.NET em aplicativos ASP.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 autenticação baseada em cookie, semelhante à Autenticação de Formulários do ASP.NET. - EntityFramework
O Entity Framework é a tecnologia de acesso a dados recomendada pela Microsoft para bancos de dados relacionais.
Migrando do Membership para o ASP.NET Identity
Esperamos fornecer diretrizes em breve para migrar seus aplicativos existentes que usam ASP.NET Membership ou Simple Membership para o novo sistema ASP.NET Identity.
Próximas etapas
- Criar um aplicativo ASP.NET MVC 5 com Facebook e Google OAuth2 e OpenID Sign-on
O tutorial usa a API de Identidade do ASP.NET para adicionar informações de perfil ao banco de dados do usuário e como autenticar com o Google e o Facebook. - Criar um aplicativo MVC ASP.NET com autenticação e banco de dados SQL e implantar no Serviço de Aplicativo do Azure
Este tutorial mostra como usar a API de Identidade para adicionar usuários e funções. - https://github.com/rustd/AspnetIdentitySample
Aplicativo de exemplo que mostra como adicionar funções básicas e suporte ao usuário e como fazer funções e gerenciamento de usuários.