2011-11-18 50 views
17

Tengo un proyecto con 2 áreas/Admin y/Usuario.enrutamiento MVC basado en roles

ruta por defecto de administración es /Admin/Home/Índice de y ruta por defecto del usuario es /usuario/Home/Índice de.

¿Es posible implementar el enrutamiento para que su URL a casa para que parezca /Perfil/Índice sino para mostrar el contenido de /Admin/Home/Índice de para administradores y /usuario/Home/Índice de para los usuarios ?

UPD

Finalmente averiguar cómo hacerlo

context.MapRoute(
    "Admin", 
    "Profile/{action}", 
    new { area = AreaName, controller = "Home", action = "Index" }, 
    new { RoleConstraint = new Core.RoleConstraint() }, 
    new[] { "MvcApplication1.Areas.Admin.Controllers" } 
); 
... 
context.MapRoute(
    "User", 
    "Profile/{action}", 
    new { area = AreaName, controller = "Home", action = "Index" }, 
    new { RoleConstraint = new Core.RoleConstraint() }, 
    new[] { "MvcApplication1.Areas.User.Controllers" } 
); 

public class RoleConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     string roleName = db.GetRoleByUserName(httpContext.User.Identity.Name); 
     string areaName = route.Defaults["area"].ToString(); 
     return areaName == roleName; 
    } 
} 

Funciona, pero en cuanto a mí, no es el camino MVC. ¿Alguien sabe cómo hacerlo bien?

Respuesta

4

Sí. El ejemplo que mostró está muy cerca de muchas de las muestras provistas por Microsoft para usar Restricciones de ruta. El motor de enrutamiento actúa como un pre-proxy (o enrutador, si se quiere) antes de pasar la solicitud a un control. Los elementos como IRouteConstraint están definidos para que pueda hacer exactamente lo que describió.

3

Me gusta esa solución como se señala, pero una cosa a tener en cuenta es que el enrutamiento en sí mismo no debe utilizarse como la única forma de seguridad. Solo tenga en cuenta que debe asegurar sus Controladores y Acciones con el atributo [Autorizar], o como sea que limite el acceso.

Cuestiones relacionadas