Controle de Usuários para ASP.NET (e Windows Forms!) Criando o primeiro usuário em um BD vazio
Leonel Fraga de Oliveira
28/03/2009 12:50

Graças a Deus tenho recebido vários feedbacks positivos e com dúvidas a respeito do Controle de Acesso para Sistemas ASP.NET (a série de artigos mais popular do NM Tech) e isto tem me motivado e muito a continuar escrevendo!
Uma das dificuldades que me repassaram é a criação do primeiro usuário em um banco de dados vazio.
Mas não é só fazer um insert into na mão?
Infelizmente, da maneira que foi implementada, isto não é possível.
Veja como fazer (após o break!)
Para ter um thans de segurança a mais, implementei o campo SENHA como um BLOB, e neste BLOB será colocado o hash MD5 da senha que o usuário digitar, em sua forma binária. E convenhamos, como iremos inserir diretamente, na munheca mesmo um BLOB no banco de dados?
Para contornar este problema, fiz uma sugestão, baseando-se na nossa aplicação exemplo:
- Comentar, na masterpage, o trecho de código que faz a verificação de acesso. - Entrar diretamente no cadastro de perfis (colocar esta página como página inicial do projeto). - Cadastrar um perfil com todas as permissões e cadastrar um usuário neste perfil - Descomentar o código do controle de acesso.
Pronto, uma sugestão que mais beira à POG, mas tá valendo!
Maaaaaaaaas
não é sempre que podemos fazer isso, não é?
Para facilitar as coisas, criei uma pequena aplicação Windows Forms com a qual poderão ser criados (porém não alterados, somente inserir) perfis e usuários.

Como você pode ver, é bem simples: basta digitar um perfil, clicar no botão Criar Perfil, digitar um usuário e uma senha e clicar em Criar Usuário
.
Para esta aplicação (download no final do post!), adicionei as referências da DLL do UserManager (a mesma que usamos na aplicação ASP.NET) e do Provider Firebird Client (sim, estou utilizando a versão do FB) e criei um arquivo de configuração com a string de conexão necessária.
Caso queiram utilizar a versão para SQL Server, basta trocar a DLL pela a que utiliza o SQL Server e mudar a string de conexão.
Vamos dar uma olhadinha no código desse formulário?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using UserManager;
namespace App1stUser
{
public partial class frmPrincipal : Form
{
public frmPrincipal()
{
InitializeComponent();
}
private void frmPrincipal_Load(object sender, EventArgs e)
{
TPerfilUsuario p = new TPerfilUsuario();
try
{
lbListaPerfil.DisplayMember = "Descricao";
lbListaPerfil.DataSource = p.ListarTodos();
}
finally
{
p.Dispose();
}
}
private void btnCriaPerfil_Click(object sender, EventArgs e)
{
TPerfilUsuario p = new TPerfilUsuario();
try
{
p.Descricao = tbxPerfil.Text;
for (int i = 0; i < p.Modulos.Count; i++)
{
p.Modulos[i].PodeAcessar = 1;
}
p.Inserir();
lbListaPerfil.DisplayMember = "Descricao";
MessageBox.Show(p.MsgInfo);
lbListaPerfil.DataSource = p.ListarTodos();
}
finally
{
p.Dispose();
}
}
private void btnCriaUser_Click(object sender, EventArgs e)
{
TUsuario u = new TUsuario();
try
{
u.Nome = tbxLogin.Text;
u.Login = tbxLogin.Text;
u.Senha = tbxSenha.Text;
u.PerfilId = (lbListaPerfil.SelectedItem as TPerfilUsuario).PerfilId;
u.Status = "A";
u.Inserir();
MessageBox.Show(u.MsgInfo);
}
finally
{
u.Dispose();
}
}
private void btnAbreFrmTeste_Click(object sender, EventArgs e)
{
string msg = "";
TUsuario u = TUsuario.Autenticar(tbxLogin.Text, tbxSenha.Text, out msg);
wfCadUsuarios frmcaduser = new wfCadUsuarios();
if (u != null)
{
try
{
if (u.Perfil.TemAcesso(frmcaduser.Name))
{
frmcaduser.ShowDialog();
}
else
{
MessageBox.Show("Ops, sem acesso!");
}
}
finally
{
u.Dispose();
}
}
else
{
MessageBox.Show(msg);
}
}
}
}
Mais simples que isso impossível
Como você pode ver, apenas instanciei as classes, preenchi as propriedades e chamei os métodos, todos eles já conhecidos do exemplo em ASP.NET.
Lembra, como eu disse nesse post que pensava em portar para Windows Forms?
Pois é, meu querido
Este é um pequeno port, não tendo somente a funcionalidade de alteração, que pode ser facilmente implementada. O mais legal é que o controle de acesso aos formulários de uma aplicação Windows Forms é feito DA MESMA MANEIRA!!! Modificações na biblioteca UserManager: NENHUMA, ZERO.
No botão Abrir Form de Teste da nossa aplicação fazemos a autenticação do usuário que está digitado na caixa de texto Login e abrimos um formulário, chamado propositalmente de wfCadUsuarios.
Instanciamos este formulário em uma variável (no nosso exemplo, a variável frmcaduser), e passamos a propriedade Name para o método TemAcesso da classe TPerfilUsuario. Se o método retornar true, chamamos o método ShowDialog() do forumulário e caso contrário disparamos uma mensagem.
Neste caso, implementei o controle de acesso antes de abrir o formulário, diferentemente do ASP.NET que eu faço a verificação quando o form já está em processamento. Mas nada impede que seja criado um formulário pai e que o controle de acesso seja feito em seu evento OnLoad, e que os demais forms herdem dele.
Aplicação para criação de Usuários do Controle de Acesso para ASP.NET (82 KiB)
Um abraço e até!