Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Filtro Global - Detalhes e correção

Pessoal,

No vídeo da aula 11 - "Filtro para autorização de usuários", nós tivemos aos 12 minutos um corte, onde o instrutor simplesmente comentou a linha "filters.Add(new AutorizacaoFilterAttribute());" e nenhum contorno foi proposto ou apresentado.

Essa ação gerou algumas dúvidas, como pude perceber nos tópicos abaixo:

Pois bem, como comentado pelo Marcelo Oliveira em um dos tópicos acima, há uma saída para ignorarmos um Filtro Global.

O Marcelo cita o link "https://www.davidhayden.me/blog/filter-overrides-in-asp-net-mvc-5" com a estrutura para correção, mas alguns detalhes importantes não são observados e por isso eu gostaria de compartilhar abaixo quais foram as medidas que tomei para poder usar o Filtro Global em toda a aplicação, exceto no LoginController.

Seguem-se as etapas

  • 1) Aparentemente há um bug em Filter Overrides no MVC 5.0, por isso, sugiro atualizar a versão do MVC para a versão mais recente estável (atualmente 5.2.7) - Você pode fazer isso dentro do Visual Studio através do gerenciamento de pacotes NuGet nas referências do seu projeto.

  • 2) Dentro da pasta Filters, você precisa criar a classe que tratará o Override do seu filtro global. Essa classe precisa herdar "ActionFilterAttribute" e precisa implementar "IOverrideFilter":

namespace CaelumEstoque.Filters
{
    public class OverrideAutorizacaoAttribute : ActionFilterAttribute, IOverrideFilter
    {
        public Type FiltersToOverride { get { return typeof(IActionFilter); } }
    }
}
  • 3) É importante observar que diferente do que fora comentado no tópico sobre o problema, o seu "typeof" não deve retornar "AutorizacaoFilterAttribute", mas sim "IActionFilter" (nesse caso).

  • [Para mais informações sobre os tipos à serem retornados, vale uma breve olhada nesse comentário]

  • 4) Com a classe criada, não esqueça de remover o comentário da linha supracitada na classe "FilterConfig", localizada dentro da pasta "App_Start".

    filters.Add(new AutenticationFilterAttribute());
  • 5) Finalmente, anote o seu "LoginController" com a sua classe "OverrideAutorizacaoAttribute". Assim, sua página de login não demandará uma "Autorização" (AutorizacaoFilterAttribute).

[OverrideAutorizacaoAttribute]
 public class LoginController : Controller { 
        //código suprimido ...
}

Também é importante lembrarmos de remover a anotação [AutorizacaoFilter] do seu "ProdutoController", pois nesse momento essa anotação pontual não é mais necessária, afinal, a autorização é global.

Seguindo essas etapas, teremos o problema resolvido e a sua página de login será exibida normalmente, enquanto as outras páginas da aplicação somente serão exibidas se houver uma sessão ativa.

Compartilho essas informações para aqueles que assim como eu ficaram um pouco perdidos ou instigados com a solução apresentada no vídeo.

Att,

João.