Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

GlobalFilterCollection Erro

Pessoal boa noite !

Gostaria que todo o usuário que tentasse acessar a aplicação, tivesse que se autenticar, então resolvi adicionar o : AutenticationFilterAttribute no GlobalFilterCollection.

Fiz dessa forma:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new AutenticationFilterAttribute()); }

Porém ao executar o mesmo, tomo esse erro:

Esta página da web tem um loop de redirecionamento.

Devo criar uma View de Login, e colocar ela para Ser minha rota de inicialização?

2 respostas
solução!

Olá Andrey

Esse erro acontece pois o filtro de autenticação não foi projetado para ser utilizado como filtro global. Quando o usuário acessa a aplicação, não importando qual a action que ele está tentando acessar, o filtro verifica se o usuário está logado e caso ele não esteja, faz um redirect para a tela de login.

No redirect, o navegador do usuário tenta acessar a action do formulário de login, porém antes de acessar a action o filtro é executado e faz novamente um redirect para a tela de login, veja que temos um loop infinito de redirects.

Para resolver o problema, dentro do filtro se o usuário estiver tentando acessar o LoginController, precisamos deixar o usuário passar mesmo quando não tivermos um usuário logado:

public override void OnActionExecuting(ActionExecutingContext ctx) { object usuario = ctx.HttpContext.Session["usuarioLogado"]; // se o usuário não está tentando se logar e ele não está logado // queremos redirecioná-lo para a tela de login if(!(ctx.Controller is LoginController) && usuario == null) { // faz o redirect } // se o código não entrar no if, então o usuário pode passar para o controller }

Victor, boa noite !

Obrigado pelo retorno. Implementei o Filtro dessa forma:

public class AutenticationFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { object usuario = filterContext.HttpContext.Session["usuario"];

if ((filterContext.Controller is LoginController) || usuario != null) { base.OnActionExecuting(filterContext); } else { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Login", action = "Index" })); } }