image

Bootcamps ilimitados + curso de inglês para sempre

80
%OFF
Article image
André Fanelli
André Fanelli04/07/2025 00:57
Compartilhe
Randstad - Análise de DadosRecomendados para vocêRandstad - Análise de Dados

Multi-Tenant no ASP.NET Core: Controle de acesso baseado em TenantId

    Como parte do projeto que está em desenvolvimento (portifólio pessoal), serão redigidos alguns artigos sobre tecnologias, arquiteturas e conceitos utilizados no projeto Inventarium.

    Este artigo tem como objetivo explicar uma arquitetura utilizada no projeto, que é o Multi-Tenant. A ideia de implementar essa arquitetura surgiu após avaliar a dificuldade que seria, separar, a princípio, cada empresa em um banco de dados exclusivo. Então, a melhor solução encontrada foi a utilização do TenantId para separar os ativos de inventário de cada empresa, trazendo mais segurança e escalabilidade.

    A ideia do projeto surgiu de uma necessidade em um antigo emprego, onde o inventário era feito de forma manual, preenchendo várias colunas no Excel, para diversos tipos de equipamentos. Resultado: 

    • Trabalho massante;
    • Todo ano precisava atualizar ou refazer do zero em alguns casos;
    • Planilhas que desapareciam ou acabavam corrompendo;

    

    Introdução

    Primeiramente, o que é uma aplicação Multi-Tenant?

    Bom, imagine que você é dono de um prédio com 10 apartamentos e, em algum momento, você decide alugá-los. Você terá 10 locatários morando no seu prédio. Agora, imagine que o prédio é a infraestrutura da sua aplicação e os locatários são os tenants.

    Então, basicamente os aplicativos multi-tenant são aplicações de software projetadas para atender vários locatários em uma única estrutura.

    O projeto é dividido em duas aplicações: Web e Desktop. No desktop app, é realizada apenas a inserção dos dados. Já no web app, é possível fazer o restante do CRUD e outras funções, tais como: realizar cadastro inicial do usuário, cadastrar novos usuários (Administradores ou Apenas Consulta) a partir do usuário inicial criado, exportar para Excel ou PDF (essa feature ainda está em desenvolvimento) e conseguir gerar o executável do desktop app (com o tenant do usuário logado).

    Mas, por que adotar multi-tenant? 

    Custo x benefício: é possível atender várias pessoas (ou empresas), usando uma única base de código.

    Escalabilidade: além de ser altamente escalável, podem acomodar novos locatários sem alterações significativas no ambiente.

    Flexibilidade: permite que os locatários configurem seu ambiente de acordo com suas necessidades específicas, sem afetar outros.


    Como foi implementado

    a) Adição do campo TenantId nas tabelas

    Cada entidade principal do sistema (como CadPc, CadNote, CadMonitor etc.) recebeu uma nova coluna chamada TenantId, do tipo string.

    Esse campo identifica a que empresa (tenant) aquele registro pertence.

    public class CadPc
    {
      public int Id { get; set; }
      public string Unidade { get; set; }
      public string TenantId { get; set; } // ← Aqui está o vínculo multi-tenant
      ...
    }
    

    b) Registro automático do TenantId

    Ao cadastrar novos dados, o sistema associa automaticamente o TenantId do usuário logado ao novo registro.

    c) Filtro por TenantId em todas as consultas

    Para garantir o isolamento dos dados entre empresas, todos os SELECT aplicam um filtro como:

    var tenantId = await GetTenantIdAsync();
    var registros = await _context.Computers
                  .Where(c => c.TenantId == tenantId)
                  .ToListAsync();
    

    d) Middleware para popular Claims

    Foi criado um TenantClaimsMiddleware que, ao autenticar o usuário, insere o TenantId dele como uma Claim:

    identity.AddClaim(new Claim("TenantId", user.TenantId));
    

    Assim, esse valor fica disponível globalmente em User.Claims, e não precisa mais consultar o banco toda hora.

    e) Criação de usuários filhos

    O primeiro usuário de cada empresa (tenant) é um administrador e pode cadastrar outros usuários que herdam automaticamente seu TenantId. Isso garante que todos os usuários da mesma empresa compartilhem os mesmos dados.


    Benefícios da abordagem

    • Fácil manutenção.
    • Segurança e isolamento lógico.
    • Crescimento horizontal sem replicar código.


    Dicas para quem quer aplicar

    • Crie um serviço para resolver o Tenant atual.
    • Evite duplicar lógica de filtro: centralize via Middleware ou Service.
    • Valide o TenantId na criação de registros.

    

    Conclusão

    Multi-tenant é uma arquitetura amplamente adotada no mundo da tecnologia e usada por empresas como: Salesforce, Dropbox, Microsoft (Office 365) e Zendesk.

    Com ela você elimina a necessidade de ter vários bancos de dados, o que complica a gerência, backup e desempenho. Além de aumentar a escalabilidade e flexibilidade, tornando projetos mais viáveis, principalmente nas fases iniciais.

    Essa arquitetura não é muito complexa de se aprender, pois uma vez entendendo o conceito, torna-se mais “fácil” sua aplicabilidade no projeto.

    Se gostou do conteúdo, me ajude com sugestões e dicas para melhorar meu projeto. Acredito no mundo open source.

    Compartilhe
    Recomendados para você
    GFT Start #7 .NET
    GFT Start #7 - Java
    Deal Group - AI Centric .NET
    Comentários (3)
    André Fanelli
    André Fanelli - 04/07/2025 10:28

    Primeiramente, muito obrigado pelo feedback!

    Bom, os desafios foram e continuam sendo muitos. Como minha preocupação principal é o back-end funcionar de forma bem otimizada, procurei bastante sobre arquiteturas que poderiam funcionar bem com meu projeto de inventário. E uma grande aliada nessa busca foram as IAs, mais especificamente o ChatGPT. Usei ele, não para me passar código pronto, mas para me explicar soluções viáveis para o meu projeto. Dentre uma delas foi o uso do TenantID.

    Com isso, meu primeiro desafio foi: como eu vou gerar esse TenantID e como posso aplicar o filtro correto para que sejam exibidos apenas os dados vinculados aquele TenantID. No filtro tive bastante dificuldade, até que pesquisando vi a solução no uso do Middleware. E foi sucesso, depois de aplicar isso, consegui exibir apenas dos dados na consulta que pertencem ao usuário logado.

    Agora estou com outros desafios e, a medida que for resolvendo, vou procurar escrever mais artigos contando minha experiência. Acredito muito no uso da IA como um "grande buscador" e organizador de informações. Mas, vale lembrar que é necessário conhecimento no que está pedindo, pois diversas vezes obtive respostas "ruins".

    DIO Community
    DIO Community - 04/07/2025 09:54

    André, seu artigo sobre a arquitetura Multi-Tenant com ASP.NET Core é extremamente esclarecedor, especialmente para quem está explorando como otimizar a estrutura de suas aplicações para diferentes empresas (tenants). Você fez um excelente trabalho ao explicar o conceito de forma simples, usando a analogia do prédio com vários locatários, o que facilita a compreensão do conceito para iniciantes.

    A forma como você descreveu a implementação do TenantId nas tabelas, bem como o uso do Middleware para inserir o TenantId nas Claims, mostra o quão bem estruturada sua solução é para garantir segurança e isolamento entre os dados. Também gostei muito das dicas práticas para quem está começando a adotar essa arquitetura.

    Na sua opinião, quais são os principais desafios que você enfrentou ao implementar essa arquitetura em seu projeto, e como superou esses obstáculos?

    Carlos Barbosa
    Carlos Barbosa - 04/07/2025 01:41

    Ótimo artigo !! 🚀

    Recomendados para vocêRandstad - Análise de Dados