msdn19_capa.JPG

Clique aqui para ler todos os artigos desta edição

 

Gerenciamento de Credenciais no Windows Forms e ASP.NET

por Juval Lowy

Este artigo discute

Este artigo usa as seguintes tecnologias:

·          Gerenciamento de credenciais de usuário

·          O modelo dos procedures de segurança do ASP.NET

·          Segurança de arquitetura personalizada do Windows Forms

·          Considerações de segurança de acesso ao código de aplicativos clientes

Windows Forms, ASP.NET, Web services, C#

 

Download:

Security.exe (220KB)

Chapéu

ASP.NET

 

 

Os aplicativos intranet do Windows® Forms freqüentemente recorrem ao armazenamento de credenciais do usuário em um banco de dados, mesmo quando implementado em um Windows ambiente homogêneo. Isso tem origem nas limitações de uso de contas do Windows. No caso de aplicativos ASP.NET, o Microsoft® .NET Framework 2.0 fornece gerenciamento de credenciais personalizadas pronto para uso. Você pode autenticar facilmente os usuários e autorizá-los sem precisar usar contas Windows. Isso poupa tempo e esforço valiosos dos desenvolvedores, sem contar que fornece uma solução segura e de alta qualidade.

Este artigo apresenta um conjunto de classes de interação auxiliares que permite que um aplicativo Windows Forms utilize a infra-estrutura de gerenciamento de credenciais do ASP.NET com a mesma facilidade que a de um aplicativo ASP.NET. Isso proporciona os benefícios de produtividade do ASP.NET, bem como o armazenamento de credenciais unificado, independentemente da interface de usuário que está sendo empregada. Além disso, apresenta algumas técnicas de programação e diversas outras melhores práticas de design e programação.

 

Infra-estrutura de Segurança do ASP.NET

Antes de demonstrar aqui como usufruir as vantagens do gerenciamento de credenciais de usuário do ASP.NET, você precisa aprender um pouco sobre o assunto. Prontamente para uso, os aplicativos ASP.NET podem armazenar suas credenciais de usuário personalizadas no SQL Server™ ou no SQL Server Express. Dito isto, a arquitetura de gerenciamento de credenciais é a mesma de um modelo de provedor, e você pode facilmente adicionar outras opções de armazenamento, tais como um banco de dados Microsoft Access. Os desenvolvedores ASP.NET podem configurar seus aplicativos diretamente do Visual Studio® 2005. Quando eles selecionam ASP.NET Configuration no menu Web site, o Visual Studio 2005 navega até as páginas de administração do ASP.NET e permite que você configure vários parâmetros de segurança, conforme mostrado na Figura 1. Nela, você tem acesso ao provedor de gerenciamento do site, onde pode selecionar o armazenamento a ser usado, como, por exemplo, um banco de dados SQL Server ou SQL Server Express. As páginas de administração permitem criar novos usuários e excluir usuários existentes, criar novas funções e excluir funções existentes e alocar usuários a funções. Observe que são usadas as mesmas tabelas de banco de dados para armazenar as informações de usuário de múltiplos aplicativos de ASP.NET. Como resultado, cada registro de função ou usuário é também associado a um nome de aplicativo associado.

 

image001.gif

Figura 1 Configuração de Segurança de Aplicativo do ASP.NET

 

Para usar o provedor SQL Server, execute o arquivo de configuração aspnet_regsql.exe encontrado em \WINDOWS\Microsoft.NET\Framework\Version\. O programa de configuração criará um novo banco de dados denominado aspnetdb, que contém as tabelas e os stored procedures exigidos para gerenciar as credenciais.

Em tempo de execução, o ASP.NET autenticará os chamadores usando as credenciais do banco de dados. A maneira mais fácil de permitir que um usuário forneça as credenciais é soltar um controle Login no Web Form. O controle Login coleta o nome e a senha do usuário e os autentica usando a classe MembershipProvider, definida da seguinte maneira:

 

public abstract class MembershipProvider : ProviderBase

{

   public abstract string ApplicationName{get;set;}

   public abstract bool ValidateUser(string name, string password);

   ...

}

 

A meta do MembershipProvider consiste em encapsular o provedor real utilizado e os detalhes do acesso de dados real, bem como em permitir que o provedor do associado seja alterado sem que isso afete o aplicativo propriamente dito. Dependendo do provedor de segurança configurado, o controle Login usará uma classe de acesso a dados, como SqlMembershipProvider, que deriva da classe MembershipProvider durante o uso do SQL Server:

 

public class SqlMembershipProvider : MembershipProvider

{...}

 

No entanto, o controle Login interage apenas com a classe base MembershipProvider. O controle Login obtém o provedor de associados exigido acessando a propriedade estática Provider da classe Membership, definida como:

 

public sealed class Membership

{

   public static string ApplicationName{get;set;}

   public static MembershipProvider Provider{get;}

   public static bool ValidateUser(string userName, string password);

   ...

}

 

A classe Membership oferece muitos membros, que por sua vez oferecem suporte a todos os aspectos do gerenciamento de usuário. Membership.Provider retorna uma instância do provedor configurado com base nas configurações do arquivo de configuração do aplicativo da Web.

Vou me concentrar nos dois membros da classe Membership. O primeiro é a propriedade ApplicationName, que é usada para definir e recuperar o nome do aplicativo. O segundo é o método ValidateUser, que autentica as credenciais especificadas em relação ao armazenamento, retornando true se elas coincidirem e false de outro modo. O método Membership.ValidateUser estático consiste em uma abreviatura para recuperar o provedor configurado do Membership.Provider e usar o método ValidateUser da instância.

Você pode aplicar a segurança baseada em função para autorizar as operações ou acessos aos recursos. O banco de dados aspnetdb armazena o mapeamento de usuários a funções. Uma vez autenticado o usuário, o ASP.NET configurará a propriedade User do contexto HTTP e a página para um objeto principal de segurança denominado RolePrincipal:

 

public sealed class RolePrincipal : IPrincipal

{...}

 

RolePrincipal usa a classe abstrata RoleProvider:

 

public abstract class RoleProvider : ProviderBase

{

   public abstract string ApplicationName{get;set;}

   public abstract bool IsUserInRole(string username, string roleName);

   public abstract string[] GetRolesForUser(string userName);

   ...

}

 

A propriedade ApplicationName do RoleProvider vincula o provedor de função ao aplicativo específico. O método IsUserInRole verifica o membership da função do usuário. O método GetRolesForUser retorna todas as funções das quais um usuário especificado é membro.

Assim como os membership providers, dependendo da segurança do provedor, o RolePrincipal usa a classe de acesso a dados correspondente tal como SqlRoleProvider para autorizar a chamada:

 

public class SqlRoleProvider : RoleProvider

{...}

 

Você pode obter o provedor de função necessário acessando a propriedade estática Provider da classe Roles, definida como:

 

public sealed class Roles

{

...

Quer ler esse conteúdo completo? Tenha acesso completo