Tutorial de Login em C#: Segurança e Tratamento de Erros

Um sistema de login é a porta de entrada de qualquer aplicação. Erros mal tratados aqui podem levar a vulnerabilidades de segurança🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real., frustração do usuário e dificuldades na manutenção. Neste artigo, vamos abordar a criação de um sistema de login em C# que não apenas autentica usuários, mas também comunica problemas de forma clara, registra eventos para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! análise futura e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. previne falhas que possam comprometer a aplicação.

Tabela de Conteúdo🔗

Visão Geral do Desafio🔗

O desafio é construir uma tela (ou interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. de console) para login onde o usuário informe credenciais (nome de usuário/e-mail e senha) e o sistema valide esses dados. A diferença está no tratamento de erros🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!Descubra como implementar testes de unidade focados em tratamento de erros, evitando surpresas em produção e garantindo sistemas confiáveis e robustos. robusto, que deve capturar qualquer exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código., falha de conexão ou erro de lógica que possa ocorrer durante o login.

Principais objetivos:

Modelando o Fluxo de Login🔗

A base de um sistema de login costuma envolver:

1. Recebimento das credenciais.

2. Autenticação (ex: consultar banco de dadosConceitos fundamentais de NoSQL: bases para trabalhar com MongoDB em C#Conceitos fundamentais de NoSQL: bases para trabalhar com MongoDB em C#Descubra os fundamentos do NoSQL e aprenda como utilizar MongoDB com C# para desenvolver aplicações .NET escaláveis e modernas até 2025. ou algum repositório de dados).

3. Retorno de sucesso ou falha.

Alguns exemplos de problemas que podem surgir:

Tratamento de Erros e Exceções🔗

Para lidar com esses cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades., precisamos planejar bem o uso de try/catch💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código.. Exemplos:

A ideia é que cada camada do sistema seja responsável pelos erros que conhece melhor.

Podemos também criar exceções específicas, mas sem exagerar - se usarmos vários tipos de exceções customizadas💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código., vira bagunça rapidamente. Mantenha uma organização clara.

Implementação Passo a Passo🔗

Classe de Domínio Básica

public class Usuario
{
    public string NomeUsuario { get; set; }
    public string SenhaHash { get; set; }
    public bool ContaBloqueada { get; set; }
    public int TentativasLogin { get; set; }
}

Exceções Customizadas

public class LoginException : Exception
{
    public LoginException(string message) : base(message) {}
}
public class ContaBloqueadaException : LoginException
{
    public ContaBloqueadaException() : base("Conta bloqueada! Contacte o suporte.") {}
}
public class CredenciaisInvalidasException : LoginException
{
    public CredenciaisInvalidasException(int tentativasRestantes)
        : base($"Credenciais inválidas. Tentativas restantes: {3 - tentativasRestantes}") {}
}

Camada de Serviço com Validações

public class LoginService
{
    private readonly IUsuarioRepository _repository;
    public Usuario Autenticar(string usuario, string senha)
    {
        if (string.IsNullOrEmpty(usuario) || string.IsNullOrEmpty(senha))
            throw new ArgumentException("Campos obrigatórios não preenchidos!");
        var user = _repository.ObterPorUsuario(usuario)
            ?? throw new UsuarioNaoEncontradoException(usuario);
        if (user.ContaBloqueada)
            throw new ContaBloqueadaException();
        if (!VerificarSenha(senha, user.SenhaHash))
        {
            user.TentativasLogin++;
            if (user.TentativasLogin >= 3)
                user.ContaBloqueada = true;
            _repository.Atualizar(user);
            throw new CredenciaisInvalidasException(user.TentativasLogin);
        }
        user.TentativasLogin = 0;
        _repository.Atualizar(user);
        return user;
    }
}

Estratégias de Tratamento de Erros🔗

Técnicas Essenciais:

1. Fail Fast: ValidaçãoComo Assegurar Validação e Cobertura de Código em Projetos LINQComo Assegurar Validação e Cobertura de Código em Projetos LINQAprenda estratégias avançadas para testar consultas LINQ, garantindo cobertura de código e confiabilidade com ferramentas e práticas recomendadas. inicial dos inputs.

2. Exceções💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. Específicas: Comunicação clara do erro.

3. Estado Persistido: Rastreamento de tentativasTimeout e Retries: Estratégias de Resiliência com Async/AwaitTimeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação..

4. Resource Cleanup: using para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! conexões de banco.

Testando o Sistema🔗

Casos de Teste Recomendados:

// Teste de autenticação bem-sucedida
var usuarioValido = loginService.Autenticar("admin", "Senha@123");
Assert.NotNull(usuarioValido);
// Teste de usuário inexistente
Assert.Throws<UsuarioNaoEncontradoException>(() =>
    loginService.Autenticar("fantasma", "senha"));

Dicas de Segurança Básica🔗

Melhores Práticas em Produção🔗

1. Never Trust Input: Sempre valide e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. sanitize entradas.

public string SanitizarInput(string input)
{
    return Regex.Replace(input, @"[^\w@.]", string.Empty);
}

2. Defesa em Profundidade: ValidaçãoComo Assegurar Validação e Cobertura de Código em Projetos LINQComo Assegurar Validação e Cobertura de Código em Projetos LINQAprenda estratégias avançadas para testar consultas LINQ, garantindo cobertura de código e confiabilidade com ferramentas e práticas recomendadas. no cliente, servidor e banco.

3. Logs Estruturados📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável.:

logger.LogInformation("Login attempt for {User}", usuario);
logger.LogWarning("Multiple failures for {User}: {Attempts}", usuario, tentativas);

4. Monitoramento🚀 Kubernetes: Orquestração de Microservices na Nuvem!🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade. Proativo: Alertas📊 Monitoramento com Prometheus: Métricas em Tempo Real!📊 Monitoramento com Prometheus: Métricas em Tempo Real!Descubra como implementar o Prometheus para monitoramento em sistemas .NET, com métricas em tempo real e dashboards inteligentes. para múltiplas falhas consecutivas.

Conclusão🔗

Resolver este desafio vai familiarizar você com a forma de lidar com problemas em um fluxo de login. É muito mais que só verificar senhas: é ter robustez no tratamento de erros🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!Descubra como implementar testes de unidade focados em tratamento de erros, evitando surpresas em produção e garantindo sistemas confiáveis e robustos., para que nenhuma exceção derrube o sistema silenciosamente. Com esse conhecimento, você pode evoluir e refinar cada camada, garantindo que sua aplicação seja confiável e segura, mesmo em cenários de falha inesperados. Bom aprendizado! 🚀

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados