Partilhar via


Noções básicas sobre segurança e suporte do ASP.NET (C#)

por Scott Mitchell

Observação

Desde que este artigo foi escrito, os provedores de associação de ASP.NET foram substituídos por ASP.NET Identity. É altamente recomendável atualizar aplicativos para usar a plataforma ASP.NET Identity em vez dos provedores de associação apresentados no momento em que este artigo foi escrito. ASP.NET Identity tem várias vantagens sobre o sistema de associação ASP.NET, incluindo :

  • Melhor desempenho
  • Extensibilidade e testabilidade aprimoradas
  • Suporte para OAuth, OpenID Connect e autenticação de dois fatores
  • Suporte à identidade baseada em declarações
  • Melhor interoperabilidade com ASP.Net Core

Baixar PDF

Este é o primeiro tutorial de uma série de tutoriais que explorarão técnicas para autenticar visitantes por meio de um formulário da Web, autorizar o acesso a páginas e funcionalidades específicas e gerenciar contas de usuário em um aplicativo ASP.NET.

Introdução

Qual é a única coisa que fóruns, sites de comércio eletrônico, sites de email online, sites de portal e sites de rede social têm em comum? Todos eles oferecem contas de usuário. Os sites que oferecem contas de usuário devem fornecer vários serviços. No mínimo, novos visitantes precisam ser capazes de criar uma conta e os visitantes que retornam devem ser capazes de fazer logon. Esses aplicativos Web podem tomar decisões com base no usuário conectado: algumas páginas ou ações podem ser restritas apenas a usuários conectados ou a um determinado subconjunto de usuários; outras páginas podem mostrar informações específicas para o usuário conectado ou podem mostrar mais ou menos informações, dependendo de qual usuário está exibindo a página.

Este é o primeiro tutorial de uma série de tutoriais que explorarão técnicas para autenticar visitantes por meio de um formulário da Web, autorizar o acesso a páginas e funcionalidades específicas e gerenciar contas de usuário em um aplicativo ASP.NET. Ao longo desses tutoriais, examinaremos como:

  • Identificar e registrar usuários em um site
  • Use ASP. Estrutura de associação do NET para gerenciar contas de usuário
  • Criar, atualizar e excluir contas de usuário
  • Limitar o acesso a uma página da Web, diretório ou funcionalidade específica com base no usuário conectado
  • Use ASP. Estrutura de funções do NET para associar contas de usuário a funções
  • Gerenciar funções de usuário
  • Limitar o acesso a uma página da Web, diretório ou funcionalidade específica com base na função do usuário conectado
  • Personalize e estenda o ASP. Controles web de segurança do NET

Esses tutoriais são voltados para serem concisos e fornecem instruções passo a passo com muitas capturas de tela para orientá-lo visualmente. Cada tutorial está disponível nas versões C# e Visual Basic e inclui um download do código completo usado. (Este primeiro tutorial se concentra em conceitos de segurança de um ponto de vista de alto nível e, portanto, não contém nenhum código associado.)

Neste tutorial, discutiremos conceitos importantes de segurança e quais recursos estão disponíveis em ASP.NET para ajudar na implementação de autenticação de formulários, autorização, contas de usuário e funções. Vamos começar!

Observação

A segurança é um aspecto importante de qualquer aplicativo que abrange decisões físicas, tecnológicas e políticas e requer um alto grau de planejamento e conhecimento de domínio. Esta série de tutoriais não se destina a ser um guia para o desenvolvimento de aplicativos Web seguros. Em vez disso, ele se concentra especificamente em autenticação de formulários, autorização, contas de usuário e funções. Enquanto alguns conceitos de segurança giram em torno dessas questões são discutidos nesta série, outros são deixados inexplorados.

Autenticação, autorização, contas de usuário e funções

Autenticação, autorização, contas de usuário e funções são quatro termos que serão usados com muita frequência ao longo desta série de tutoriais, portanto, gostaria de aproveitar um momento rápido para definir esses termos dentro do contexto de segurança da Web. Em um modelo cliente-servidor, como a Internet, há muitos cenários em que o servidor precisa identificar o cliente que está fazendo a solicitação. A autenticação é o processo de verificação da identidade do cliente. Um cliente que foi identificado com êxito é considerado autenticado. Dizem que um cliente não identificado é não autenticado ou anônimo.

Os sistemas de autenticação segura envolvem pelo menos uma das três facetas a seguir: algo que você sabe, algo que você tem ou algo que você é. A maioria dos aplicativos Web depende de algo que o cliente sabe, como uma senha ou um PIN. As informações usadas para identificar um usuário - seu nome de usuário e senha, por exemplo - são conhecidas como credenciais. Esta série de tutoriais se concentra na autenticação de formulários, que é um modelo de autenticação em que os usuários fazem logon no site fornecendo suas credenciais em um formulário de página da Web. Todos nós já experimentamos esse tipo de autenticação antes. Vá para qualquer site de comércio eletrônico. Quando estiver pronto para marcar, você será solicitado a fazer logon inserindo seu nome de usuário e senha em caixas de texto em uma página da Web.

Além de identificar clientes, um servidor pode precisar limitar quais recursos ou funcionalidades estão acessíveis dependendo do cliente que está fazendo a solicitação. A autorização é o processo de determinar se um determinado usuário tem autoridade para acessar um recurso ou funcionalidade específico.

Uma conta de usuário é um repositório para manter informações sobre um usuário específico. As contas de usuário devem incluir minimamente informações que identifiquem exclusivamente o usuário, como o nome de logon e a senha do usuário. Junto com essas informações essenciais, as contas de usuário podem incluir coisas como: o endereço de email do usuário; a data e a hora em que a conta foi criada; a data e a hora em que fizeram logon pela última vez; nome e sobrenome; número de telefone; e endereço de endereçamento. Ao usar a autenticação de formulários, as informações da conta de usuário normalmente são armazenadas em um banco de dados relacional como o Microsoft SQL Server.

Aplicativos Web que dão suporte a contas de usuário podem, opcionalmente, agrupar usuários em funções. Uma função é simplesmente um rótulo que é aplicado a um usuário e fornece uma abstração para definir regras de autorização e funcionalidade no nível da página. Por exemplo, um site pode incluir uma função de Administrador com regras de autorização que proíbem qualquer pessoa, exceto um Administrador, de acessar um determinado conjunto de páginas da Web. Além disso, uma variedade de páginas acessíveis a todos os usuários (incluindo não administradores) pode exibir dados adicionais ou oferecer funcionalidade extra quando visitada por usuários na função Administradores. Usando funções, podemos definir essas regras de autorização em uma base função por função em vez de usuário por usuário.

Autenticando usuários em um aplicativo ASP.NET

Quando um usuário insere uma URL na janela de endereço do navegador ou clica em um link, o navegador faz uma solicitação HTTP (Protocolo de Transferência de Hipertexto) para o servidor Web para o conteúdo especificado, seja uma página ASP.NET, uma imagem, um arquivo JavaScript ou qualquer outro tipo de conteúdo. O servidor Web é encarregado de retornar o conteúdo solicitado. Ao fazer isso, ele deve determinar várias coisas sobre a solicitação, incluindo quem fez a solicitação e se a identidade está autorizada a recuperar o conteúdo solicitado.

Por padrão, os navegadores enviam solicitações HTTP que não têm qualquer tipo de informação de identificação. Mas se o navegador incluir informações de autenticação, o servidor Web iniciará o fluxo de trabalho de autenticação, que tenta identificar o cliente que está fazendo a solicitação. As etapas do fluxo de trabalho de autenticação dependem do tipo de autenticação que está sendo usado pelo aplicativo Web. ASP.NET dá suporte a três tipos de autenticação: Windows, Passport e formulários. Esta série de tutoriais se concentra na autenticação de formulários, mas vamos levar um minuto para comparar e contrastar autenticação do Windows armazenamentos de usuários e fluxo de trabalho.

Autenticação por meio da Autenticação do Windows

O fluxo de trabalho autenticação do Windows usa uma das seguintes técnicas de autenticação:

  • Autenticação Básica
  • Autenticação digest
  • Autenticação Integrada do Windows

Todas as três técnicas funcionam aproximadamente da mesma maneira: quando uma solicitação anônima não autorizada chega, o servidor Web envia de volta uma resposta HTTP que indica que a autorização é necessária para continuar. Em seguida, o navegador exibe uma caixa de diálogo modal que solicita ao usuário seu nome de usuário e senha (consulte a Figura 1). Essas informações são então enviadas de volta para o servidor Web por meio de um cabeçalho HTTP.

Uma caixa de diálogo modal solicita ao usuário suas credenciais

Figura 1: Uma caixa de diálogo modal solicita ao usuário suas credenciais

As credenciais fornecidas são validadas na Windows User Store do servidor Web. Isso significa que cada usuário autenticado em seu aplicativo Web deve ter uma conta do Windows em sua organização. Isso é comum em cenários de intranet. Na verdade, ao usar a Autenticação Integrada do Windows em uma configuração de intranet, o navegador fornece automaticamente ao servidor Web as credenciais usadas para fazer logon na rede, suprimindo assim a caixa de diálogo mostrada na Figura 1. Embora autenticação do Windows seja ótimo para aplicativos de intranet, geralmente é inviável para aplicativos da Internet, pois você não deseja criar contas do Windows para cada usuário que se inscreve em seu site.

Autenticação por meio da Autenticação de Formulários

A autenticação de formulários, por outro lado, é ideal para aplicativos Web da Internet. Lembre-se de que a autenticação de formulários identifica o usuário solicitando que ele insira suas credenciais por meio de um formulário da Web. Consequentemente, quando um usuário tenta acessar um recurso não autorizado, ele é redirecionado automaticamente para a página de logon em que pode inserir suas credenciais. As credenciais enviadas são então validadas em um repositório de usuários personalizado – geralmente um banco de dados.

Depois de verificar as credenciais enviadas, um tíquete de autenticação de formulários é criado para o usuário. Esse tíquete indica que o usuário foi autenticado e inclui informações de identificação, como o nome de usuário. O tíquete de autenticação de formulários é (normalmente) armazenado como um cookie no computador cliente. Portanto, as visitas subsequentes ao site incluem o tíquete de autenticação de formulários na solicitação HTTP, permitindo assim que o aplicativo Web identifique o usuário depois que ele tiver feito logon.

A Figura 2 ilustra o fluxo de trabalho de autenticação de formulários de um ponto de vista de alto nível. Observe como as partes de autenticação e autorização em ASP.NET atuam como duas entidades separadas. O sistema de autenticação de formulários identifica o usuário (ou relata que ele é anônimo). O sistema de autorização é o que determina se o usuário tem acesso ao recurso solicitado. Se o usuário não estiver autorizado (como está na Figura 2 ao tentar visitar anonimamente ProtectedPage.aspx), o sistema de autorização informará que o usuário foi negado, fazendo com que o sistema de autenticação de formulários redirecione automaticamente o usuário para a página de logon.

Depois que o usuário tiver feito logon com êxito, as solicitações HTTP subsequentes incluem o tíquete de autenticação de formulários. O sistema de autenticação de formulários apenas identifica o usuário – é o sistema de autorização que determina se o usuário pode acessar o recurso solicitado.

O fluxo de trabalho de autenticação de formulários

Figura 2: o fluxo de trabalho de autenticação de formulários

Investigaremos a autenticação de formulários com muito mais detalhes no próximo tutorial, Uma Visão geral da Autenticação de Formulários. Para obter mais informações sobre o ASP. Opções de autenticação do NET, consulte Autenticação ASP.NET.

Limitando o acesso a páginas da Web, diretórios e funcionalidade de página

ASP.NET inclui duas maneiras de determinar se um determinado usuário tem autoridade para acessar um arquivo ou diretório específico:

  • Autorização de arquivo – como ASP.NET páginas e serviços Web são implementados como arquivos que residem no sistema de arquivos do servidor Web, o acesso a esses arquivos pode ser especificado por meio de ACLs (Controle de Acesso Listas). A autorização de arquivo é mais comumente usada com autenticação do Windows porque as ACLs são permissões que se aplicam a contas do Windows. Ao usar a autenticação de formulários, todas as solicitações no nível do sistema operacional e do sistema de arquivos são executadas pela mesma conta do Windows, independentemente do usuário visitar o site.
  • Autorização de URL– com autorização de URL, o desenvolvedor de página especifica regras de autorização no Web.config. Essas regras de autorização especificam quais usuários ou funções têm permissão para acessar ou são impedidos de acessar determinadas páginas ou diretórios no aplicativo.

Autorização de arquivo e autorização de URL definem regras de autorização para acessar uma página ASP.NET específica ou para todas as páginas ASP.NET em um diretório específico. Usando essas técnicas, podemos instruir ASP.NET a negar solicitações a uma página específica para um usuário específico ou permitir o acesso a um conjunto de usuários e negar acesso a todos os outros. E os cenários em que todos os usuários podem acessar a página, mas a funcionalidade da página depende do usuário? Por exemplo, muitos sites que dão suporte a contas de usuário têm páginas que exibem conteúdo ou dados diferentes para usuários autenticados versus usuários anônimos. Um usuário anônimo pode ver um link para fazer logon no site, enquanto um usuário autenticado verá uma mensagem como, Bem-vindo de volta, Nome de usuário junto com um link para fazer logoff. Outro exemplo: ao exibir um item em um site de leilões, você verá informações diferentes dependendo se você é um licitante ou aquele que leiloa o item.

Esses ajustes no nível da página podem ser realizados declarativamente ou programaticamente. Para mostrar conteúdo diferente para usuários anônimos do que autenticados, basta arrastar um controle LoginView para sua página e inserir o conteúdo apropriado em seus modelos AnonymousTemplate e LoggedInTemplate. Como alternativa, você pode determinar programaticamente se a solicitação atual é autenticada, quem é o usuário e a quais funções ela pertence (se houver). Você pode usar essas informações para mostrar ou ocultar colunas em uma grade ou Painéis na página.

Esta série inclui três tutoriais que se concentram na autorização. A autorização baseada no usuárioexamina como limitar o acesso a uma página ou páginas em um diretório para contas de usuário específicas; A autorização baseada em função analisa o fornecimento de regras de autorização no nível da função; por fim, o tutorial Exibindo conteúdo com base no usuário conectado no momento explora a modificação do conteúdo e da funcionalidade de uma página específica com base no usuário que visita a página. Para obter mais informações sobre o ASP. Opções de autorização do NET, consulte Autorização ASP.NET.

Contas de usuário e funções

ASP. A autenticação de formulários do NET fornece uma infraestrutura para que os usuários façam logon em um site e tenham seu estado autenticado lembrado em visitas de página. E a autorização de URL oferece uma estrutura para limitar o acesso a arquivos ou pastas específicos em um aplicativo ASP.NET. Nenhum dos recursos, no entanto, fornece um meio para armazenar informações da conta de usuário ou gerenciar funções.

Antes do ASP.NET 2.0, os desenvolvedores eram responsáveis por criar seus próprios repositórios de usuários e funções. Eles também estavam no gancho para criar as interfaces do usuário e escrever o código para páginas essenciais relacionadas à conta de usuário, como a página de logon e a página para criar uma nova conta, entre outras. Sem nenhuma estrutura de conta de usuário interna em ASP.NET, cada desenvolvedor que implementasse contas de usuário precisava chegar às suas próprias decisões de design sobre perguntas como, Como fazer armazenar senhas ou outras informações confidenciais? e Quais diretrizes devo impor sobre o tamanho e a força da senha?

Hoje, a implementação de contas de usuário em um aplicativo ASP.NET é muito mais simples graças à estrutura de associação e aos controles internos da Web de logon. A estrutura Associação é um punhado de classes no namespace System.Web.Security que fornecem funcionalidade para executar tarefas essenciais relacionadas à conta de usuário. A classe-chave na estrutura Associação é a classe Membership, que tem métodos como:

  • CreateUser
  • DeleteUser
  • Getallusers
  • Getuser
  • Updateuser
  • Validateuser

A estrutura Associação usa o modelo de provedor, que separa de forma limpa a API da estrutura de associação de sua implementação. Isso permite que os desenvolvedores usem uma API comum, mas permite que eles usem uma implementação que atenda às necessidades personalizadas do aplicativo. Em suma, a classe Membership define a funcionalidade essencial da estrutura (os métodos, as propriedades e os eventos), mas não fornece detalhes de implementação. Em vez disso, os métodos da classe Membership invocam o provedor configurado, que é o que executa o trabalho real. Por exemplo, quando o método CreateUser da classe Membership é invocado, a classe Membership não sabe os detalhes do repositório de usuários. Ele não sabe se os usuários estão sendo mantidos em um banco de dados ou em um arquivo XML ou em algum outro repositório. A classe Membership examina a configuração do aplicativo Web para determinar para qual provedor delegar a chamada e essa classe de provedor é responsável por realmente criar a nova conta de usuário no repositório de usuários apropriado. Essa interação é ilustrada na Figura 3.

A Microsoft envia duas classes de provedor de associação no .NET Framework:

Esta série de tutoriais se concentra exclusivamente no SqlMembershipProvider.

O modelo de provedor permite que diferentes implementações sejam conectadas perfeitamente à estrutura</forte>

Figura 03: o modelo de provedor permite que diferentes implementações sejam conectadas perfeitamente à estrutura (clique para exibir a imagem em tamanho real)

O benefício do modelo de provedor é que implementações alternativas podem ser desenvolvidas pela Microsoft, fornecedores de terceiros ou desenvolvedores individuais e conectadas perfeitamente à estrutura de associação. Por exemplo, a Microsoft lançou um provedor de associação para bancos de dados do Microsoft Access. Para obter mais informações sobre os provedores de associação, consulte o Kit de Ferramentas do Provedor, que inclui um passo a passo dos provedores de Associação, provedores personalizados de exemplo, mais de 100 páginas de documentação sobre o modelo de provedor e o código-fonte completo para os provedores de Associação internos (ou seja, ActiveDirectoryMembershipProvider e SqlMembershipProvider).

ASP.NET 2.0 também introduziu a estrutura Funções. Assim como a estrutura Associação, a estrutura Funções é criada em cima do modelo de provedor. Sua API é exposta por meio da classe Roles e o .NET Framework é fornecido com três classes de provedor:

  • AuthorizationStoreRoleProvider – gerencia informações de função em um repositório de políticas do gerenciador de autorização, como Active Directory ou ADAM.
  • SqlRoleProvider – implementa funções em um banco de dados SQL Server.
  • WindowsTokenRoleProvider - associa informações de função com base no grupo windows do visitante. Esse método normalmente é usado com autenticação do Windows.

Esta série de tutoriais se concentra exclusivamente no SqlRoleProvider.

Como o modelo de provedor inclui uma única API voltada para o futuro (as classes Associação e Funções), é possível criar funcionalidades em torno dessa API sem precisar se preocupar com os detalhes da implementação – eles são tratados pelos provedores selecionados pelo desenvolvedor da página. Essa API unificada permite que a Microsoft e fornecedores de terceiros criem controles Web que interface com as estruturas Associação e Funções. ASP.NET é fornecido com vários controles da Web de logon para implementar interfaces de usuário comuns da conta de usuário. Por exemplo, o controle logon solicita a um usuário suas credenciais, as valida e, em seguida, registra-as por meio da autenticação de formulários. O controle LoginView oferece modelos para exibir marcação diferente para usuários anônimos versus usuários autenticados ou marcação diferente com base na função do usuário. E o controle CreateUserWizard fornece uma interface do usuário passo a passo para criar uma nova conta de usuário.

Abaixo do abrange os vários controles de logon interagem com as estruturas Associação e Funções. A maioria dos controles de Logon pode ser implementada sem precisar escrever uma única linha de código. Examinaremos esses controles com mais detalhes em tutoriais futuros, incluindo técnicas para estender e personalizar suas funcionalidades.

Resumo

Todos os aplicativos Web que dão suporte a contas de usuário exigem recursos semelhantes, como: a capacidade dos usuários de fazer logon e fazer logon status lembrados em visitas à página; uma página da Web para novos visitantes criarem uma conta e a capacidade do desenvolvedor de páginas de especificar quais recursos, dados e funcionalidades estão disponíveis para quais usuários ou funções. As tarefas de autenticação e autorização de usuários e do gerenciamento de contas de usuário e funções são notavelmente fáceis de realizar em aplicativos ASP.NET graças à autenticação de formulários, à autorização de URL e às estruturas Associação e Funções.

Ao longo dos próximos tutoriais, examinaremos esses aspectos criando um aplicativo Web em funcionamento do zero de forma passo a passo. Nos próximos dois tutoriais, exploraremos a autenticação de formulários em detalhes. Veremos o fluxo de trabalho de autenticação de formulários em ação, dissecaremos o tíquete de autenticação de formulários, discutiremos as preocupações de segurança e veremos como configurar o sistema de autenticação de formulários , tudo isso durante a criação de um aplicativo Web que permite que os visitantes façam logon e façam logoff.

Programação feliz!

Leitura Adicional

Para obter mais informações sobre os tópicos discutidos neste tutorial, consulte os seguintes recursos:

Sobre o autor

Scott Mitchell, autor de sete livros do ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Microsoft Web desde 1998. Scott trabalha como consultor independente, treinador e escritor. Seu último livro é Sams Teach Yourself ASP.NET 2.0 em 24 Horas. Ele pode ser contatado em mitchell@4GuysFromRolla.com. ou através de seu blog, que pode ser encontrado em http://ScottOnWriting.NET.

Agradecimentos Especiais

Esta série de tutoriais foi revisada por muitos revisores úteis. O revisor principal deste tutorial foi Esta série de tutoriais foi revisada por muitos revisores úteis. Os principais revisores deste tutorial incluem Alicja Maziarz, John Suru e Teresa Murphy. Interessado em revisar meus próximos artigos do MSDN? Nesse caso, solte-me uma linha em mitchell@4GuysFromRolla.com.