4
respostas

OnActionExecuting - Loop

Boa noite.

O redirecionamento não está funcionando, quando o usuário entra em qualquer tela sem estar logado. Ele entra em loop na pagina até a falha. Tem alguma solução ?

No - AutorizacaoFilterAttribute

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
            object usuario = filterContext.HttpContext.Session["usuarioLogado"];
            if (usuario == null)
            {
                filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary(
                        new { controller = "Login", action = "Index", area = "" }
                    )
                );
            }
}

No Global.asax

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); //REGISTRO FILTROS DE AUTORIZAÇÃO

No - FilterConfig

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
            filters.Add(new AutorizacaoFilterAttribute());
}
4 respostas

Yago,

Ao criar um filtro você precisa usar um annotation em cima das classes ou metodos onde será preciso utilizar uma validação. Nas suas classe onde precisa validar se o usuário esta logado você vará assim.

    [FiltroAutenticacao]
    public class GruposController : Controller

Ou

[FiltroAutenticacao]
 public ActionResult Index()

Att. Fabiano Farah

Olá Yago,

o problema é que justamente o filtro de autorização virou global, ou seja, está sendo aplicado para todas as requisições. Então quando seu usuário tenta acessar qualquer tela, ele verifica que não está logado e dispara uma nova requisição para o Index do LoginController. Só que esta nova requisição vai passar novamente pelo filtro e verificar que não está logado, redirecionando mais uma vez para o Index do LoginController. E assim cai num loop infinito de requisições.

O que você precisa fazer neste caso, é criar uma anotação que faça o LoginController ignorar o seu AutorizacaoFilterAttribute. No Asp.Net MVC 5 eles criaram uma interface chamada de IOverrideFilter que quando anotado numa action ou num controller faz com que ele ignore algum filtro específico. A ideia é você criar a sua classe que implementa esta interface e coloque a lógica dizendo para ignorar o AutorizacaoFilterAttribute. Aqui tem um link dando um exemplo de como usar a interface IOverrideFilter.

Também tive o mesmo problema e acho estranho esse problema não estar corrigido ou mencionado no curso. Estou verificando a página passada pelo Lucas Takeshi, mas ainda estou tendo problemas. Será que poderiam consertar essa falha no curso e colocar aqui um exemplo prático baseado no ensinamento que nos foi passado no curso MVC 5? Estou querendo dar prosseguimento aos estudos e estou perdendo tempo buscando uma solução que, acredito, não deveria estar hoje no módulo, uma vez que já foi relatado aqui no Fórum.

Agradeceria muito.

Eu não consegui implementar a solução sugerida pelo Lucas, mas, consegui contornar o problema fazendo o seguinte ajuste no filtro de autorização:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace CaelumEstoque.Filtros
{
    public class AutorizacaoFilterAttribute : ActionFilterAttribute
    {
        //Antes de executar o controller
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            object usuarioLogado = filterContext.HttpContext.Session["usuarioLogado"];
            if (usuarioLogado == null)
            {
                if (filterContext.Controller is CaelumEstoque.Controllers.LoginController)
                {
                    //Nao faz nada
                } else { 
                    filterContext.Result = new RedirectToRouteResult(
                                new RouteValueDictionary(
                                   new { action = "Index", controller = "Login" }));
                    }
            }
        }
    }
}