2011-11-18 5 views
17

Ho un progetto con 2 aree/Amministratore e/Utente.Routing basato su ruolo MVC

percorso di default di amministrazione è /Amministratore/Home/Indice e instradamento di default dell'utente è /utente/Home/Indice.

E 'possibile implementare il routing per rendere il loro URL casa a guardare come /Profilo/Indice ma per mostrare contenuti da /Amministratore/Home/Indice per gli amministratori e /utente/Home/Indice per gli utenti ?

upd

infine scoprire come farlo

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; 
    } 
} 

Funziona, ma per me non è il modo MVC. Qualcuno sa come farlo bene?

risposta

4

Sì. L'esempio che hai mostrato è molto vicino a molti dei campioni forniti da Microsoft per l'utilizzo di Route Constraints. Il motore di routing funge da pre-proxy (o router, se lo si desidera) prima che la richiesta venga passata a un controllo. Elementi come IRouteConstraint sono definiti in modo da poter fare solo ciò che hai descritto.

3

Mi piace questa soluzione, come si nota, ma una cosa da tenere a mente è che l'instradamento stesso non deve essere utilizzato come unica forma di sicurezza. Tieni presente che dovresti proteggere i tuoi controllori e le tue azioni con l'attributo [Autorizza], o comunque stai limitando l'accesso.