F-ES Sitecore
Нет никакой реальной ценности в этом, если вы хотите знать роль пользователя, а затем получить роль, когда вам нужно это знать, взяв ее из url-адреса, это проблема безопасности. Если вы просто хотите, чтобы он был на url-адресе для эстетики, то что-то вроде этого может помочь
Создание обработчика маршрута
public class UserRoleHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
// Work out the role here, I am hard-coding for simplicity
string userRole = "Admin";
requestContext.RouteData.Values["role"] = userRole;
return new MvcHandler(requestContext);
}
}
и обновите свое отображение маршрута по умолчанию следующим образом
routes.MapRoute(
name: "Default",
url: "{role}/{controller}/{action}/{id}",
defaults: new { role = "User", controller = "Home", action = "Index", id = UrlParameter.Optional }
).RouteHandler = new UserRoleHandler();
Мы поставили параметр role первым, но пользовательский UserRoleHandler будет гарантировать, что значение роли-это та роль, в которой находится пользователь, а не то, что находится на url-адресе. Таким образом, даже если кто-то вручную изменит "пользователь" на "администратор", значение роли все равно будет пользователем, если это то, что они есть.
Выше приведен MVC 5, Вам может потребоваться настроить его по мере необходимости, если вы не используете 5.
Обновление
Исходный маршрут не будет работать с этой конфигурацией, если вы хотите, чтобы традиционный маршрут "контроллер/действие" работал, вы можете попробовать что-то вроде
routes.MapRoute(
name: "Default",
url: "Account/{role}/{controller}/{action}/{id}",
defaults: new { role = "User", controller = "Home", action = "Index", id = UrlParameter.Optional }
).RouteHandler = new UserRoleHandler();
routes.MapRoute(
name: "Traditional",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Проблема с несколькими маршрутами, как описано выше, заключается в том, что при создании URL-адресов, если вы хотите специально иметь стандартный шаблон url-адресов, Вам нужно указать, что вы хотите использовать "традиционный" маршрут. Альтернативой является то, что вы оставляете значение по умолчанию таким, как оно есть, и используете значение с ролью не по умолчанию, но тогда каждый раз, когда вам нужен url-адрес в этом формате, вам нужно будет выбрать соответствующее имя маршрута при его создании.