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

Problema com filtro.

Não estou conseguindo fazer com que o filtro funcione. Só compila se eu comentar a linha. //filters.Add(new AutorizacaoFilterAttribute());

Se eu descomentar ele a aplicação fica travada nesta url http://localhost:51270/Login

// Código do FilterConfig.cs é

using CaelumEstoque.Filtros;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CaelumEstoque.App_Start
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new AutenticacaoFilterAttribute());
        }
    }
}

// Global.asax.cs
using CaelumEstoque.App_Start;
using CaelumEstoque.Filtros;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

// Arquivo utilizado para configurações globais da aplicação.
namespace CaelumEstoque
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        }
    }
}


// AutorizacaoFilterAttribute.cs
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 AutenticacaoFilterAttribute : ActionFilterAttribute
    {
        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"
                }));
            }
        }
    }
}

// Produto Controller simplesmente adicionei acima da classe.
    [AutorizacaoFilter] // Anotação vale para todas as páginas.
    public class ProdutoController : Controller
7 respostas

Alguém que conseguistes compilar o programa deste capítulo poderias disponibilizar o código fonte p/ download ? Eu notei que no vídeo fora comentando a linha //filters.Add(new AutorizacaoFilterAttribute());

solução!

O programa está compilando perfeitamente, o problema é que se você colocar o filtro de autorização como global, você sempre redireciona o usuário para a página de login se o usuário ainda não se logou.

Então se você entrar em qualquer página, você será enviado para a url /login, mas como o filtro é global, ele será executado também em /login, então o usuário será redirecionado novamente para /login, veja que temos um loop infinito de redirect, também conhecido como redirect loop.

Oi Djalma

O seu problema foi resolvido?

Eu tive o mesmo problema e ainda não resolvi. Tem como definir que o LoginController não usa o filtro ?

No argumento do OnActionExecuting do filtro você pode ler uma propriedade chamada Controller que contem a instância do controller que será utilizada pelo Asp.Net MVC para tratar a requisição web.

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
   object controller = filterContext.Controller;
   object usuarioLogado = filterContext.HttpContext.Session["usuarioLogado"];
   if(!(controller is LoginController) && (usuarioLogado == null))
   {
      // lógica de redirecionamento
   }
}

Com esse filtro você consegue liberar a página de login mesmo quando o filtro é global.

Obrigada

Nossa estava com o mesmo problema , valeu mesmo ai victor , e ja resolvi (kkkk)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software