MVC-маршрутизация на основе ролей - PullRequest
17 голосов
/ 18 ноября 2011

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

Маршрут администратора по умолчанию / Admin / Home / Index , а маршрут пользователя по умолчанию / User / Home/Index.

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

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 ]

4 голосов
/ 19 ноября 2011

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

3 голосов
/ 13 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...