Grill Decisions — #30 Middleware Ordering
Data: 2026-07-08
Decisão 1: Abordagem de fix — reordenar vs refatorar vs não mexer
Pergunta: Como corrigir o bug de ordering do middleware? UseAuthentication() está DEPOIS de UseEndpoints() (terminal) e nunca executa.
Opções:
| # | Abordagem | O que faz | Prós | Contras |
|---|---|---|---|---|
| A | Reordenar Startup.Configure() | Mover UseAuthNConf() ANTES de UseApiConf() | 1 linha por serviço, sem alterar lógica interna, pipeline by-the-book | UseAuthZ fica duplicado (no-op inofensivo) |
| B | Extrair UseEndpoints de UseApiConf | Separar UseEndpoints() para fora do método, chamar por último | Pipeline "limpo", sem duplicatas | Refactor maior em 4 serviços, risco de regressão |
| C | Não mexer no ordering | Confiar no lazy auth do UseAuthorization() | Zero risco | Só funciona com [Authorize]; não resolve #30 para endpoints públicos; SignalR quebrado (#29) |
Decisão: Abordagem A — reordenar chamadas no Startup.Configure().
Trade-off: A duplicata do UseAuthorization() (uma em UseApiConf, uma em UseAuthNConf) fica como débito técnico para remoção futura. A segunda chamada é no-op quando User já autenticado — sem impacto funcional. A remoção exige alterar UseApiConfiguration() em cada serviço, o que é um refactor de baixo risco mas fora do escopo deste card de segurança.
Decisão 2: Escopo — 4 serviços vs ~17 serviços
Pergunta: O bug de ordering afeta ~17 serviços. Corrigir todos ou só os 4 do escopo do pentest?
Opções:
- Apenas 4 serviços do pentest (checkout, cart, product, store)
- Todos os ~17 serviços de uma vez
Decisão: Apenas 4 serviços do pentest.
Trade-off: Os 4 serviços cobrem os endpoints vulneráveis documentados no relatório (#08 profile-fraud, #07 SQL injection, #30 schema override). Demais serviços têm o mesmo bug mas não foram testados no pentest. Corrigir 17 serviços de uma vez aumenta risco de regressão e dilui o foco. Card futuro: "fix middleware ordering nos serviços restantes" como batch.
Decisão 3: Duplicata UseAuthorization() — remover agora ou depois
Pergunta: Após reordenar, UseAuthorization() será chamado DUAS vezes (uma em UseApiConf L79, uma em UseAuthNConf L85). Remover a duplicata?
Opções:
- Remover
UseAuthorization()doUseApiConfiguration()em cada serviço (agora) - Deixar a duplicata (no-op) e remover depois
Decisão: Deixar a duplicata. Remover depois em card separado.
Trade-off: A segunda chamada de UseAuthorization() é no-op quando HttpContext.User já está autenticado — o AuthorizationMiddleware verifica se já foi aplicado e pula. Remover agora exigiria alterar UseApiConfiguration() em 4 serviços (mais 1 ponto de falha). Card futuro de "limpeza" pode remover de todos os serviços de uma vez.
Decisão 4: Ordem de implementação — #08 antes de #30
Pergunta: #30 (ordering) é pré-requisito para #08 (adicionar [Authorize]) ou podem ser implementados em paralelo?
Análise: #08 adiciona [Authorize(JwtBearer)] em endpoints de payment. Com o bug de ordering, o lazy auth do UseAuthorization() dispara a validação JWT — funciona. Portanto #08 não depende de #30.
Mas: sem #30, endpoints que NÃO receberam [Authorize] (via #08) continuam com HttpContext.User vazio → claim schema null → header ainda vence.
Opções:
- #08 primeiro (funciona via lazy auth), #30 depois
- #30 primeiro (pré-requisito), #08 depois
- Juntos no mesmo card
Decisão: #08 primeiro, #30 depois. Sequência de implementação: #08 → #30.
Trade-off: #08 mitiga o risco imediato (endpoints de payment sem auth). #30 é melhoria sistêmica que beneficia todos os endpoints. Ordem de risco decrescente. Se #30 for implementado antes, #08 ganha defesa adicional (User populado mesmo sem lazy auth), mas a ordem inversa não cria risco novo.
Decisão 5: UseSwaggerConfiguration() antes de auth — problema?
Pergunta: Após mover UseAuthNConf() para cima, UseSwaggerConfiguration() fica ANTES dos middlewares de auth. Isso é um problema?
Análise: UseSwaggerConfiguration() registra:
UseSwagger()— middleware que serveswagger.jsonUseSwaggerUI()— middleware que serve a página HTML do Swagger
Ambos são middlewares de arquivos estáticos. Eles não precisam de autenticação — servem assets públicos.
Decisão: Manter Swagger antes de auth. Inofensivo.
Trade-off: Se no futuro o Swagger precisar de auth (ambiente de produção), a ordem precisaria ser UseAuthN → UseAuthZ → UseSwagger. Mas hoje Swagger é desabilitado em produção — só Development/Staging.