Подтвердить что ты не робот

Маршрутизация на основе ролей MVC

У меня есть проект с двумя областями /Admin и/User.

Админ по умолчанию - /Admin/Home/Index, а маршрут по умолчанию - /Пользователь/Главная/Индекс.

Возможно ли реализовать маршрутизацию, чтобы сделать свой домашний URL-адрес похожим на /Профиль/Индекс, но для показа содержимого от /Admin/Home/Index для администраторов и /Пользователь/Главная/Индекс для пользователей?

обн

Наконец, узнайте, как это сделать

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. Кто-нибудь знает, как это сделать правильно?

4b9b3361

Ответ 1

Да. Пример, который вы показали, очень близок ко многим из предоставленных Microsoft образцов для использования ограничений маршрутов. Механизм маршрутизации действует как предварительный прокси (или маршрутизатор, если он есть) до того, как запрос будет передан в элемент управления. Такие предметы, как IRouteConstraint, определяются так, что вы можете делать то, что вы описали.

Ответ 2

Мне нравится это решение, как было отмечено, но нужно иметь в виду, что сама маршрутизация не должна использоваться как единственная форма безопасности. Просто имейте в виду, что вы должны защищать свои контроллеры и действия с помощью атрибута [Authorize] или, тем не менее, вы ограничиваете доступ.