none
Roles Dinamica MVC RRS feed

  • Pergunta

  • Bom dia!

    Gostaria de saber se alguem conhece como criar regras dinamicas no mvc, hoje eu consigo criar roles nas controlles e nas Actions Assim.

    [Authorize(Roles = "Admin")]
    public ActionResult Teste()
    {
       return View();
    }

    Mas eu gostaria de criar uma area administrativa para as regras , ou seja a pessoa cria uma nova regra e define o que aquela regra via ter acesso qual Action vai poder acessar.

    Grato,

    quarta-feira, 27 de junho de 2012 13:10

Todas as Respostas

  • Você pode customizar Authorize e nesse você verificar dinamicamente através de banco de dados, xml, etc. 

    Segue um exemplo para você se basear.

    Implementing a custom ASP.NET MVC authorization filter


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    quarta-feira, 27 de junho de 2012 13:37
  • Marco, Boa tarde!

    Então pasando o a class e a regra que o metodo vai aceitar eu consegui fazer. do jeito que está aqui.

    [DuffAuthorize(UserRole.Administrator)]
    
    publicvirtual ActionResult AdministerUsers()
    
     {
    
               return View();
    
       }

    o que eu preciso é assim, eu tenho uma tabela usuario,perfil,controller e action. estão todas relacionadas.

    Quando o usuario loga no sistema eu consigo saber qual o perfil dele  a controller que ele pode acessar e as actions.

    eu queria liberar pra ele somente as que estão no perfil de acordo com o que eu listei. Entendeu mais ou menos?

    Em vez deu colocar

    [DuffAuthorize(UserRole.Administrator)] 

    eu ia colocar somente

    [DuffAuthorize]

    Grato,


    sexta-feira, 29 de junho de 2012 21:01
  • Boa noite,

    Acho mais facil você criar suas regras (action) e anotar seus metodos(Actions)

    //ACTIONS

    public const string ACTION_USER_CREATE = "ACTION_USER_CREATE";

    //CONTROLLER [AuthorizeFilter(ACTIONS.ACTION_USER_CREATE)] public ActionResult Create() { return View(new WUser()); }


    //AUTHORIZEFILTER var username = filterContext.HttpContext.User.Identity.Name; IUserService userService = BootStrapper.Resolve<IUserService>(); if (!userService.IsLogged(username)) { filterContext.Result = new HttpAuthorizeFilterResult(filterContext); } User user = userService.GetUserByUsername(username); if (user != null) { if (!string.IsNullOrEmpty(_action)) AllowAction(filterContext, user);

    else

    { filterContext.HttpContext.Response.StatusCode = (int) System.Net.HttpStatusCode.Unauthorized; filterContext.Result = new HttpUnauthorizedResult(); }

    }




    Não esqueça de marcar o post como útil caso tenha te ajudado.




    • Editado Marco Souza sábado, 30 de junho de 2012 02:57
    sábado, 30 de junho de 2012 02:52
  •  Grande   da uma olhada neste link, pode ajudar

    http://kbochevski.blogspot.com.br/2009/11/mvc-forms-authentication-and.html


    http://fparmezani.wordpress.com

    sábado, 30 de junho de 2012 23:20
  • Marco beleza? cara eu consegui criar toda a minha lógica e validar. o que está class faz ela pega a controller e a action antes de entrar no metodo.

    no banco eu tenho um cadastro onde eu armazeno o id do perfil , o id das controllers deste perfil, e os ids das actions daquelas controllers. desta forma eu consigo validar se aquele perfil tem acesso ou não. se ele tem acesso o metodo retonar true senão false. O problema agora é como eu vou passar isso para minha class AuthorizeAttribute onde eu possa liberar ou redirecionar ele para uma tela de acesso negado.

    está classe é onde eu queria pegar se é true ou false para liberar ou redirecionar para uma pagina de acesso negado.

    public override void OnAuthorization(AuthorizationContext filterContext)
            {
                base.OnAuthorization(filterContext);
                
                if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAuthenticated)
                    filterContext.HttpContext.Response.Redirect("/AcessoNegado/Index");
            }    
    está classe aqui é onde tem toda a lógica de validação. se o usuario tiver acesso ela retorna true senão false.

    Obrigado!!

    public class RetornaControllerAction : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                ControllerAction(filterContext.RouteData);           
            }
    
            public bool ControllerAction(RouteData routeData)
            {
                var controllerName = routeData.Values["controller"];
                var actionName = routeData.Values["action"]; 
    
                BasicBL<Usuario> _usuario = new BasicBL<Usuario>();
                var _controller = new BasicBL<ControllerSite>();
                var _perfilController = new BasicBL<PerfilControllerAction>();
                var _action = new BasicBL<ActionSite>();
    
                var usuarioLogado =  HttpContext.Current.User.Identity.Name;
    
                var permisao = (from x in _usuario.GetAll() where x.Login == usuarioLogado select x.IdPerfil).First();
    
                var controller = (from x in _perfilController.GetAll() where x.IdPerfil == permisao select x.ControllerSite.Nome).ToList();
    
                foreach (var itemController in controller)
                {
                    if (itemController.Equals(controllerName))
                    {
                        var actions = (from x in _perfilController.GetAll() where x.ControllerSite.Nome == controllerName select x.ActionSite.Nome).ToList();
    
                        foreach (var itemActions in actions)
                        {
                            if (itemActions.Equals(actionName))
                            {
                                return true; 
                            }
                        }
                    }
                }
    
                return false;
                           
            }        
            
        }
    segunda-feira, 2 de julho de 2012 18:41
  • Herde sua classe de AuthorizeAttribute e adicione sua regra em uma classe ou metodo e chame de dentro do OnAuthorization.



    Não esqueça de marcar o post como útil caso tenha te ajudado.

    segunda-feira, 2 de julho de 2012 19:48
  • eu já estou herdando.

    public class Filters : AuthorizeAttribute
        {
            public override void OnAuthorization(AuthorizationContext filterContext)
            {            
                
                base.OnAuthorization(filterContext);
                
                if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAuthenticated)
                    filterContext.HttpContext.Response.Redirect("/AcessoNegado/Index");
            }       
    
        }

    é essa aqui não é?

    segunda-feira, 2 de julho de 2012 20:33
  • Não é necessário criar dois filtros. Vê se esse código te ajuda.

    public class AuthorizeFilterAttribute : AuthorizeAttribute
        {
            private string[] _actions = null;
            private string _action = string.Empty;
    
            public AuthorizeFilterAttribute(string action)
            {
                _action = action;
            }
    
            public AuthorizeFilterAttribute(string[] actions)
            {
                _actions = actions;
            }
    
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                base.OnAuthorization(filterContext);
    
                if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
                {
                    filterContext.Controller.TempData["msgInfo"] = Resources.Resources.MsgNeedToLogin;
                    filterContext.Result = new HttpAuthorizeFilterResult(filterContext);
                }
                else
                {
                    var username = filterContext.HttpContext.User.Identity.Name;
                    IUserService userService = BootStrapper.Resolve<IUserService>();
    
                    if (!userService.IsLogged(username))
                    {
                        filterContext.Controller.TempData["msgInfo"] = Resources.Resources.MsgNeedToLogin;
                        FormsAuthentication.SignOut();
                        filterContext.Result = new HttpAuthorizeFilterResult(filterContext);
                    }
    
                    User user = userService.GetUserByUsername(username);
    
                    if (user != null)
                    {
                        if (!string.IsNullOrEmpty(_action))
                            AllowAction(filterContext, user);
    
                        if (_actions != null)
                            AllowActions(filterContext, user);
                    }
                    else
                    {
                        filterContext.HttpContext.Response.StatusCode = (int) System.Net.HttpStatusCode.Unauthorized;
                        filterContext.Result = new HttpUnauthorizedResult();
                    }
                }
    
            }
    
            private void AllowAction(AuthorizationContext filterContext, User user)
            {
                if (!user.IsAllowedAction(_action))
                {
                    filterContext.Controller.TempData["msgInfo"] = Resources.Resources.AccessRestricted;
                    filterContext.Result = new HttpUnauthorizedResult();
                }
            }
    
            private void AllowActions(AuthorizationContext filterContext, User user)
            {
                var negate = _actions.Count(action => !user.IsAllowedAction(_action));
    
                if (negate > 0)
                {
                    filterContext.Controller.TempData["msgInfo"] = Resources.Resources.AccessRestricted;
                    filterContext.Result = new HttpUnauthorizedResult();
                }
            }
        }


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    segunda-feira, 2 de julho de 2012 21:04