Inquiridor
Roles Dinamica MVC

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,
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.
- Sugerido como Resposta João_ PradoModerator quinta-feira, 28 de junho de 2012 21:00
-
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,
-
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
-
Grande da uma olhada neste link, pode ajudar
http://kbochevski.blogspot.com.br/2009/11/mvc-forms-authentication-and.html
http://fparmezani.wordpress.com
-
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; } }
-
-
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 é?
-
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.