Desenvolvimento - ASP. NET

Autenticando usuários com diferentes níveis de acesso usando FORMS AUTHENTICATION

Artigo interessante (mais uma abordagem) sobre como fazer o login de um usuário e redirecioná-lo de acordo com seu perfil no sistema.

por Bruno Peres Orcajo



Co-autor:

Silvio Assunção Junior - assuncao.s@gmail.com
Desenvolvedor .NET C# da ArchITettura Soluções em Tecnologia.
Desenvolvedor em aplicativos web e Windows usando tecnologia .net e Delphi.

Softwares:
Visual Studio, SQLServer.

Cenário

Exemplo:
Temos uma aplicação que vamos dividir em áreas, área comum a todos os usuários, uma área restrita para clientes e uma área restrita para administradores.

Temos uma tabela de usuários, e nesta tabela cadastramos para cada usuário um perfil (Admistrador "A" ou Cliente "C") para validarmos depois.

Criando a Tabela no SQLServer

Vamos inicialmente criar uma base de dados, chamada APLICACAO_FORMSAUTHENTICATION
Vamos criar uma tabela chamada USUARIOS com os seguintes campos:

NM_USUARIO: Nome do usuário
DS_LOGIN: Login do usuário
DS_SENHA: Senha do usuário(com 32 bits, caso queira usar a senha criptografada com MD5*)
* MD5 - Nativo do framework para encriptação.
DS_PERMISSAO: Neste campo vamos definir "A" para administradores ou "C" para clientes.

Com a base pronta e a tabela você pode inserir manualmente alguns registro para testes:

Criando a Solução no Visual Studio

Vamos criar agora uma solução no Visual Studio, usando C#> ASP.NET Web Application
Para criar a solução: File> New> Blank Solution...
Vamos chamar a Solução de formsAuthentication

Criando os diretórios e arquivos iniciais

Vamos criar dois diretórios(pastas), um chamado "Administracao" e um chamado "Cliente", com uma página Default em cada diretório, onde somente administradores acessam a página Default do diretório Administracao e os clientes acessam a página Default do diretório Cliente, e restando os usuários sem autenticação acessam apenas os arquivos na raiz /.

Alterando o web.config

Primeiramente vamos configurar o web.config para forms authentication e definir os acessos dos usuários.

No elemento authentication modifique para:

Elemento Authentication

Estes são os atributos possíveis de usar no elemento Authentication, contudo só vamos usar o loginUrl.

Após o fechamento da Elemento system.web "</system.web>" coloque as seguintes Elementos:

<!--  Definindo diretórios autorizados para grupo de usuários clientes   --> 
 <location path="Cliente">
		<system.web> 
			<authorization> 
				<allow users="C" />
				<deny users="*" /> 
			</authorization> 
		</system.web>
</location> 

<!--  Definindo diretórios autorizados para grupo de usuários administradores   --> 
<location path="Administracao">
		<system.web> 
			<authorization> 
				<allow users="A" />
				<deny users="*" /> 
			</authorization> 
		</system.web>
</location>

Elemento Location

Estes são os atributos possíveis de usar no elemento Authentication, contudo só vamos usar o Path.

Criando a página de login

Vamos criar a página de login para validar o usuário, crie o arquivo Login.aspx na raiz do projeto:

Vamos criar o design, colocando dois campos, um para login e outro para senha e um botão para validar:

Nome dos componentes:
TextBox do Login: txtLogin
TextBox da Senha: txtSenha
Botão Validar: btnValidar

Vamos fazer a conexão direto na camada do front, mas isto não é recomendável, o certo é programar em camadas onde haveria uma camada de acesso a dados, contudo o intuito deste tutorial é mostrar o uso de forms authentication. Criando a conexão (ainda na página de login)

Arraste para a tela um SQLDataAdapter

Clique em next ...

Clique em New Connection e faça a sua string de conexão local na base APLICACAO_FORMSAUTHENTICATION.

Escolha a primeira opção, pois não vamos utilizar procedures e clique em next ...

Clique no botão Advanced Option…

Desmarque a primeira opção pois só vamos fazer consulta nos dados e não vamos alterá-los. Clique em Ok.

Clique em Query Builder e adicione a tabela de USUÁRIOS, escolha todas as colunas(All Columns).
Coloque em Criteria do campo DS_LOGIN: = @login (são variáveis que vamos passar)
Coloque em Criteria do campo DS_SENHA: = @senha (são variáveis que vamos passar)
Clique em Ok > Next > Finish.

Vamos renomear o dataAdapter para DAT_USUARIOS e a conexão para CNX.

Agora clique com o botão direito em cima do DAT_USUARIOS(DataAdapter) e clique em Generate Dataset... para gerarmos um dataset tipado. Vamos chamá-lo de DataSetUsuário.

O Visual Studio vai criar automaticamente um DataSetUsuarios1 na tela, renomeie para dsUsuario.

Agora vamos para o código (página de login):

#region Events
     
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

private void Button1_Click(object sender, System.EventArgs e)
{
//Chama o método que valida o login
efetuaLogin();
}

#endregion

#region Methods

private void efetuaLogin()
{
//Carrega o dataSetUsuarios
carregaDataSetUsuarios();
//Valida se o dsUsuarios está preenchido, se ele achou o usuário
if(dsUsuario.USUARIOS.Rows.Count > 0)
	//Caso encontrou, chama a função de logar usuário
	logaUsuario();
else
{
	//Senão mostra a mensagem javascript de login ou senha inválidos
	string mensagemAlert = "Usuário ou senha inválidos";
	Page.RegisterStartupScript("alerta",mensagemAlert);
}
}

private void carregaDataSetUsuarios()
{
//Passa os parametros para o dataAdapter dos TextBox
DAT_USUARIOS.SelectCommand.Parameters["DS_LOGIN"].Value = txtLogin.Text;
DAT_USUARIOS.SelectCommand.Parameters["DS_SENHA"].Value = txtSenha.Text;
//Carrega o Dataset
DAT_USUARIOS.Fill(dsUsuario);
}

private void logaUsuario()
{
//Autentica o usuário
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(dsUsuario.USUARIOS[0].DS_PERMISSAO, 
false);
}

#endregion

Criando a página Home na raiz /

Crie apenas dois links, um para Cliente e outro para Administrador para simular um acesso sem login e senha:

Ao clicar no link você será redirecionado para a página de login, pois seu usuário não tem acesso e depois que você logar terá acesso a um dos diretórios, dependendo do usuário e senha. Após o login correto o usuário é redirecionado para a página que ele tentou acessar.

Obrigado e espero que seja útil.

Bruno Peres Orcajo

Bruno Peres Orcajo - Desenvolvedor .NET C# e Designer da ArchITettura Soluções em Tecnologia.
Concentra esforços em programação e desenvolvimento de sistemas de navegação para layouts Web.