MVC基于角色的路由

时间:2011-11-18 10:56:46

标签: asp.net-mvc asp.net-mvc-3 authorization url-routing

我有一个包含2个区域/管理员和/用户的项目。

管理员的默认路线为 / Admin / Home / Index ,用户的默认路线为 /用户/主页/索引

是否可以实施路由以使其主页网址看起来像 /个人资料/索引,但是为管理员显示来自 / Admin / Home / Index 的内容对于用户来说> /用户/主页/索引?

UPD

最后了解如何做到

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

它有效,但对我而言,它不是MVC的方式。有人知道怎么做吗?

2 个答案:

答案 0 :(得分:4)

是。您展示的示例非常接近Microsoft提供的许多使用Route Constraints的示例。在将请求传递到控件之前,路由引擎充当预代理(或路由器,如果您愿意)。像IRouteConstraint这样的项目被定义,所以你可以做你所描述的。

答案 1 :(得分:3)

我喜欢这个解决方案,但要注意的一点是,路由本身不应该被用作唯一的安全形式。请记住,您应该使用[授权]属性保护您的控制器和操作,或者您限制访问。