none
Controle de Acesso Externo aos Sistemas RRS feed

  • Pergunta

  • Olá Pessoal,

    Levando em consideração que eu irei desenvolver alguns novos sistemas em ASP.Net MVC 3 ou 4, gostaria de delegar a responsabilidade de controlar os acessos das funcionalidades de todos esses novos sistemas para uma camada de segurança.

    Terei que criar um interceptor ou filter? Alguma sugestão?

    Grato.

    terça-feira, 28 de fevereiro de 2012 16:53

Respostas

  • Boa tarde.

    Voce pode delegar a funcao para um controlador, em um dos sistemas fiz assim:

    Todo controller herda de controller:

    public class ProdutoController : Controller

    Altere para que seus controllers herdem de um controller base:

    public class ItemOperadorController : BaseController

    E o BaseController implementa um OnActionExecuting:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                if (Session["Login"] == null)
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary
                        {
                            { "controller", "Usuario" },
                            { "action", "Message" }
                        });
                    return;
                }
                else
                {
                    base.OnActionExecuting(filterContext);                
                }
    
                string rota = RouteData.Values.First().Value.ToString();
                int _tipo = 0;
    
                if (rota == Rotas.ItemOperador.ToString())
                    _tipo = 2;
                if (rota == Rotas.ItemResponsavel.ToString())
                    _tipo = 3;
                if (rota == Rotas.ItemEnviarExpedicao.ToString())
                    _tipo = 4;
    
                if (_tipo > (int)Session["Tipo"])
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary
                        {
                            { "controller", "Usuario" },
                            { "action", "AcessoNegado" }
                        });
                }            
            }
        }

    No meu caso, verifico se a session esta vazia e se o usuario tem permissao para acessar a rota.

    Espero ter ajudado.


    Consultoria .NET

    ANALISTA DESENVOLVEDOR
    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como resposta.
    Blog .Net Descomplicado

    terça-feira, 28 de fevereiro de 2012 19:49

Todas as Respostas

  • Boa tarde.

    Voce pode delegar a funcao para um controlador, em um dos sistemas fiz assim:

    Todo controller herda de controller:

    public class ProdutoController : Controller

    Altere para que seus controllers herdem de um controller base:

    public class ItemOperadorController : BaseController

    E o BaseController implementa um OnActionExecuting:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                if (Session["Login"] == null)
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary
                        {
                            { "controller", "Usuario" },
                            { "action", "Message" }
                        });
                    return;
                }
                else
                {
                    base.OnActionExecuting(filterContext);                
                }
    
                string rota = RouteData.Values.First().Value.ToString();
                int _tipo = 0;
    
                if (rota == Rotas.ItemOperador.ToString())
                    _tipo = 2;
                if (rota == Rotas.ItemResponsavel.ToString())
                    _tipo = 3;
                if (rota == Rotas.ItemEnviarExpedicao.ToString())
                    _tipo = 4;
    
                if (_tipo > (int)Session["Tipo"])
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary
                        {
                            { "controller", "Usuario" },
                            { "action", "AcessoNegado" }
                        });
                }            
            }
        }

    No meu caso, verifico se a session esta vazia e se o usuario tem permissao para acessar a rota.

    Espero ter ajudado.


    Consultoria .NET

    ANALISTA DESENVOLVEDOR
    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como resposta.
    Blog .Net Descomplicado

    terça-feira, 28 de fevereiro de 2012 19:49
  • Obrigado Edson Júnior, sua resposta foi bastante útil!!!
    Agora já sei como devo proceder neste meu cenário.

    Grato.

    quarta-feira, 29 de fevereiro de 2012 15:52
  • Valeu Edson, esse seu Exemplo rodo legal e é a forma como vou usar no meu projeto, com uma classe pai para os controllers e utilizando sessão.

    Valeu mesmo.

    quinta-feira, 1 de novembro de 2012 19:45
  • Edson,

    Tentei fazer isto, e reclamou que o servidor tentou um redirecionamento incorreto.

    Sabe porquê?

    E o que seria "Rotas" ? Não vi onde de onde vem.

    Obrigado. 


    Obrigado, Att, Gabriel Braga Graduando em Sistemas de Informação PUC-Rio

    quinta-feira, 21 de fevereiro de 2013 21:02
  • Boa tarde.

    Voce pode delegar a funcao para um controlador, em um dos sistemas fiz assim:

    Todo controller herda de controller:

    public class ProdutoController : Controller

    Altere para que seus controllers herdem de um controller base:

    public class ItemOperadorController : BaseController

    E o BaseController implementa um OnActionExecuting:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                if (Session["Login"] == null)
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary
                        {
                            { "controller", "Usuario" },
                            { "action", "Message" }
                        });
                    return;
                }
                else
                {
                    base.OnActionExecuting(filterContext);                
                }
    
                string rota = RouteData.Values.First().Value.ToString();
                int _tipo = 0;
    
                if (rota == Rotas.ItemOperador.ToString())
                    _tipo = 2;
                if (rota == Rotas.ItemResponsavel.ToString())
                    _tipo = 3;
                if (rota == Rotas.ItemEnviarExpedicao.ToString())
                    _tipo = 4;
    
                if (_tipo > (int)Session["Tipo"])
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary
                        {
                            { "controller", "Usuario" },
                            { "action", "AcessoNegado" }
                        });
                }            
            }
        }

    No meu caso, verifico se a session esta vazia e se o usuario tem permissao para acessar a rota.

    Espero ter ajudado.


    Consultoria .NET

    ANALISTA DESENVOLVEDOR
    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como resposta.
    Blog .Net Descomplicado

    Olá,

    Desta maneira quando tento fazer recebo o seguinte erro do browser:

    Redirecionamento incorreto
       O Firefox detectou que o pedido para este endereço não será concluído devido à forma que o servidor o está redirecionando.
       Este problema algumas vezes pode ser causado pela desativação ou bloqueio de cookies.

    Tentei desta forma e obtive um resultado melhor:

    filterContext.Result = new ViewResult
    {
        ViewName = "~/Views/SomeController/SomeView.cshtml"
    };

    Porém, minha sessão sempre será nula, já que antes de entrar em qualquer método eu faço esta verificação. Eu nunca conseguirei preencher a sessão. Como você preenche está sessão?


    Obrigado, Att, Gabriel Braga Graduando em Sistemas de Informação PUC-Rio

    terça-feira, 26 de fevereiro de 2013 13:56