Segurança é um dos pontos mais importantes no desenvolvimento de aplicações, especialmente aplicações web. Criar um modelo de segurança complexo é um dos fatores determinantes para o sucesso de um software. Problemas de segurança além de gerar constrangimento público para a empresa dona do software(como as invasões que o Google sofreu nos últimos tempos), pode causar problemas judiciais, por exemplo pela exposição e/ou apropriação indevida dos dados de terceiros.
Quando falamos de segurança em ASP.NET, podemos fundamentar três pilares: Autorização, Representação e Autenticação. Abordarei esse assunto em mais de um artigo, por isso não tratarei tudo de uma vez.
Vamos começar nossa discusão com uma visão geral da seqüência de eventos inerentes à autenticação e à autorização cada vez que uma solicitação nova é feita à página.
Quando uma requisição chega ao IIS, ele checa a validade. Se o modo de autenticação estiver definido como anônimo(como é padrão), a requisição é aprovada automaticamente. Mas se o modo de autenticação do web.config estiver definido de forma diferente, o IIS realiza a autenticação específica antes de repassar a solicitação ao ASP.NET.
O ASP.NET por sua vez checa se a representação está habilitada(falaremos sobre representação posteriormente neste artigo). Caso esteja habilidade, o ASP.NET executa com a identidade da entidade que está realizando a operação. Do contrário, a aplicação executa a ação com a identidade local do IIS e os privilégios locais definidos para a conta de usuário do ASP.NET. Por fim, o ASP.NET engine executa uma checagem de autorização nos recursos solicitados pelo usuário autenticado, e caso ele seja autorizado, retorna a requisição pelo pipeline do IIS.
Vamos falar sobre autenticação, autorização e representação e como implementá-los em ASP.NET.
Autenticação
A autenticação determina quando um usuário tem ou não uma determinada permissão, baseada nas suas credenciais. Um usuário está autorizado a acessar os recursos, desde que esteja autenticado. O arquivo Web.config contém todas as configurações para um aplicativo ASP.NET, incluindo a forma de autenticação. Um provedor de autenticação é utilizado para checar a identidade dos usuários em um sistema. Existem 3 formas de se autenticar um usuário no ASP.NET:
- Windows authentication
- Forms authentication
- Passport authentication
Forms Authentication
Este tipo de autenticação é baseado em cookies, que armazenam login e senha do usuário em arquivos texto ou em uma base de dados. Ele utiliza cookies de persistência e de sessão. Depois que um usuário está autenticado, suas credenciais são armazenadas em cookies válidos para aquela sessão. Quando o usuário não está autenticado e requisita uma página que requer autorização, é direcionado para a página de login da aplicação. O código abaixo demonstra como aplicar isso ao ASP.NET.
<system.web>
<authentication mode="Forms"/>
<forms name="FormDeLogin" loginUrl="FormDeLogin.aspx" />
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
Perceba que o símbolo ” ? ” representa todos os usuários anônimos ou não autenticados. Normalmente, o usuário digita login e senha, clica no botão de login e o form valida os valores através de uma camada de persistência(base de dados). O código abaixo demonstra como isso pode ser validado:
String senha = txtSenha.Text;
bool usuarioValido = false;
//(...) Código que valida o usuário(...)
if(isUserValid)
{
FormsAuthentication.RedirectFromLoginPage(txtLogin.Text, False);
else // Se o usuário ou a senha são inválidos
lblErro.Text = "Login e/ou senha inválidos";
}
O método RedirectFromLoginPage cria um ticket de autenticação e o utiliza para redirecionar o usuário, agora já autenticado, de volta à pagina solicitada, ou à uma página padrão pré-definida. O código abaixo demonstra como podemos especificar credenciais de usuário diretamente no web.config.
<system.web>
<authentication mode="Forms">
<forms loginUrl="FormDeLogin.aspx">
<credentialspasswordFormat="Clear">
<user name="Usuario" password="S3nh@123" />
</credentials>
</forms>
</authentication>
<authorization>
</system.web>
</configuration>
Independentemente da técnica de autenticação utilizada, você deve encriptar o Web.config por razões de segurança. Abordarei isso posteriormente.
Você também pode utilizar a autenticação via Forms para verificar a autenticidade de um usuário em uma base de dados onde uma base de dados armazene esse tipo de informação. O código abaixo ilustra como isso pode ser feito. O método ValidarUsuario, a ser chamado diretamente na página, recebe como parâmetros login e senha, e chama o método ValidarNaBaseDeDados(que será abstraído), que por sua vez conecta-se ao banco de dados e verifica se os dados estão corretos. No caso, os parâmetros serão os textos de dois controles do tipo TextBox. Observe o código do botão de Login na página:
if(new ClassedeLogin().ValidarUsuario(txtLogin.Text,txtSenha.Text))
Response.Redirect("URL qualquer");
else
lblErro.Message = "Usuário e/ou senha inválidos."
}
E o código da classe de negócio responsável pelo Login:
public bool ValidarUsuario(string login, string senha){
bool usuarioAutenticado = false;
try
{
usuarioAutenticado = ValidarNaBaseDeDados(login,senha);
}
catch(Exception ex)
{
//Tratamento de exceções
}
return usuarioAutenticado;
}
}
Windows Authentication
A autenticação Windows é utilizada para autenticação baseada em usuários do Windows, geralmente utilizando LDAP como base de dados de usuários, utilizando o Active Directory para tal. Porém, é apenas aplicável em ambientes de intranet, aonde há um administrador com controle total sobre a rede. O código abaixo demonstra como configurar a autenticação Windows no ASP.NET.
<authorization>
<allow users ="*" />
</authorization>
Perceba que o símbolo ” * ” indica que todos os usuários, incluindo anônimos e não autenticados, terão acesso.A autenticação Windows se subdivide nos seguintes tipos:
-Autenticação anônima(Anonymous Authentication)
-Autenticação Básica(Basic Authentication)
-Autenticação sumária(Digest Authentication)
-Autenticação integrada ao Windows(Integrated Windows Authentication)
No modo de autenticação anônima, o IIS permite que qualquer usuário acesse a aplicação ASP.NET, sem nenhuma checagem de autenticação. No modo de autenticação básica, os usuários serão solicitados a digitar usuário e senha do Windows(este é um modo deveras inseguro).
A autenticação sumária é idêntica à básica, com a diferença que a senha é encriptada antes de ser enviada pela rede. No modo de autenticação integrada, a senha não é enviada através da rede, mas sim, o aplicativo usa alguns protocolos de autenticação de rede para que funcione.
Autenticação via passaporte
A autenticação via passaporte é uma autenticação centralizada, que utiliza o passaporte .NET da microsoft para autenticar os usuários em uma aplicação. Permite que o usuário crie um Login simples e uma senha para acessar qualquer site que implemente o serviço SSI do Passport .Abaixo, uma demonstração de como utilizar a autenticação Passport no ASP.NET.
<system.web>
<authenticationmode=”Passport”>
<passportredirectUrl=”LoginForm.aspx” />
</authentication>
<authorization>
<deny users=”?” />
</authorization>
</system.web>
</configuration>
Autorização
Autorização é o processo de determinada a acessibilidade a um recurso para um usuário já autenticado, e somente neles, garantindo que nenhum usuário não autenticado tenha acesso à aplicação. A sintaxe para autorização específica em ASP.NET segue abaixo.
< [ allow | deny ] [ users ] [ roles ] [ verbs ] />
</authorization>
Em ASP.NET, existem 3 formas de autorização:
-Autorização de URL
-Autorização de arquivo
-Autorização baseada em ACLs
Autorização de arquivo
A autorização de arquivos é executada através do FileAuthorizationModule, e é ativada quando a aplicação está configurada para utilizar autenticação Windows. Ela checa a lista de controle da acesso(Access Control List – ACL ) do arquivo para determinar se o usuário possui permissão de acessá-lo. As permissões de ACL são verificadas pelo Windows identity, ou caso a representação esteja ativa, pelo Windows identity do processo do ASP.NET.
Autorização de URL
A autenticação de URL é feita através do AuthorizationModule, que mapeia usuários e regras para URLs em aplicações ASP.NET. Este módulo pode ser utilizado para seletivamente permitir ou negar acesso a certas partes da aplicação(geralmente diretórios) para alguns usuários ou regras(grupos de usuários).
A autorização, tal qual a autenticação, é especificada no arquivo Web.config da aplicação. Abaixo, um exemplo de como se configura a autorização no ASP.NET .
<allow users="Bruno"/>
<deny users="OutroUsuario"/>
<deny users="?"/>
</authorization>
Também é possível especificar o local para o qual uma ou mais regras de autorização são aplicáveis. Observe abaixo:
<location path = "PaginaDeAdministracao.aspx">
<system.web>
<authorization>
<allow users = "?" />
</authorization>
</system.web>
</location>
</configuration>
Também é possível restringir ou permitir acesso ao GET ou ao POST para um ou mais usuários da aplicação ASP.NET. O código a seguir habilita o post para o usuário Bruno, enquanto nega para o resto dos usuário. Isto permite definir quem tem permissão para alterar dados na aplicação,ou apenas visualizá-los.
<allow verb = "GET" users = "*" />
<allow verb = "POST" users = "Bruno" />
<deny verb = "POST" users = "*" />
</authorization>
Representação
De acordo com a documentação oficial da Microsoft, “Quando se utiliza da representação, as aplicações ASP.NET podem opcionalmente executar com a identidade do client que as está executando”. Geralmente isto é feito para evitar complicações com autenticação e autorização no código da aplicação. Ao invés disso, você conta com o IIS para autenticar o usuário e também fornecer os tokens de autenticação ao ASP.NET. A aplicação, agora representa o cliente, e em seguida, depende das configurações dos diretórios e arquivos NTFS para permitir ou não o acesso. Assegure-se de que a partição está em formato NTFS, caso contrário as permissões não terão como ser concedidas.
Note que a representação está desabilita por padrão e pode ser especificada no Web.config, como demonstrado abaixo:
Ou, para desabilitar:
Para representar uma entidade em particular, especifique-a no seu Web.config:
Bem, por enquanto é isso. Continuarei a falar sobre segurança em ASP.NET posteriormente em outros artigos. Críticas e sugestões, os comentários estão abertos.
Abraços e keep coding.
Deixar um comentário