Hoje postaram uma dúvida no forúm da MSDN sobre controle de
Login. E eu achei interessante postar aqui uma forma simples de se criar uma
tela de login. 
Esse exemplo é em WindowsForms. 
Primei eu adicionei os seguintes controles:
- Label – Usuário e Senha
 
- TextBox – Usuário e Senha
 
- Button – Login
 
Os nomes dos controles ficaram:
- TxtUsuario
 
- TxtSenha
 
- BtnLogin
 
O form ficou dessa maneira:
No evento Click do botão Login entrei com o seguinte código:
private
void BtnLogin_Click(object
sender, EventArgs e)
{
    if
(txtUsuario.Text != string.Empty &&
txtSenha.Text != string.Empty)
    {
if (ExecutaLogin(txtUsuario.Text, txtSenha.Text))
{
   
MessageBox.Show("Bem Vindo");
}
else
{
   
MessageBox.Show("Usuário ou senha inválida");
}
    }
}
Acima eu estou verificando se o usuário preencheu os campos,
se sim, eu executo a função: ExecutaLogin(string, string), veja o código: 
private bool ExecutaLogin(string usuario, string
senha)
{
    bool ok = false;
    SqlConnection
cnnBase = new SqlConnection(ControleLogin.Properties.Settings.Default.Conexao);
    SqlCommand
cmd = new SqlCommand("select nome from usuario where login=@usuario and
senha=@senha", cnnBase);
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add("@usuario",
SqlDbType.VarChar).Value = usuario;
    cmd.Parameters.Add("@senha",
SqlDbType.VarChar).Value = senha;
    SqlDataAdapter da = new
SqlDataAdapter(cmd);
    DataTable
dt = new DataTable();
    da.Fill(dt);
    da.Dispose();
    cmd.Dispose();
    cnnBase.Close();
    if
(dt.Rows.Count == 1)
    {
return true;
    }
    else
    {
return false;
    }
    return ok;
}
O que esta sendo feito nessa função, nessa função eu utilizo
4 variáveis diferentes, são elas:
- cnnBase -  é a conexão
com o meu banco de dados, a connectionString  eu criei no App.Config. assim eu posso
centralizar e acessar de qualquer ponto do sistema.
 
- cmd – é o comando que será executado pelo SQL, no meu caso
uma consulta.
 
- da – é o retorno da minha consulta
 
- dt – é o resultado transformado da minha consulta em uma
tabela.
 
Repare que eu não estou concatenando os valores que o
usuário passou  ao comando SQL que será
executado. Isso porque o usuário pode inserir alguns códigos e quebrar o
resultado do SQL, isso é chamado de SqlInjection. Por isso eu estou adicionado como
parâmetro e informando qual é o tipo de dado que estou passando. 
Eu coloquei um IF retornando como ok somente se o retorno
for igual a um, pois se o resultado contiver mais de um registro ou não
retornar nada, o retorno tem que ser falso.
Ao executar e digitar o usuário correto, o resultado será
esse:
Digitando o usuário errado e a senha correta: