2013-12-18 3 views
10

Итак, мой Q выглядит следующим образом (MVC 5): У меня есть несколько типов страниц по умолчанию, которые я хотел бы начать, когда мое приложение встает.Различные страницы/контроллеры по умолчанию для каждого типа роли - MVC 5

1- для анонимного пользователя

2 ... 5 - для других пользовательских ролей, которые автоматически заносится в журнал (печенье).

Так что это в значительной степени просто «если», я знаю, но пока я использовал User.IsInRole («RoleName») метод, который не может быть использован в RouteConfig.cs.

Если это простое добавление С помощью инструкции, прошу прощения за упрощенность вопроса заранее.

Update: Я сумел сделать это через некоторые из них:.

если (User.UserInRole ("RoleName") возвращение RedirectToAction ("ActionName") в моем умолчанию ActionResault

Хотя это не элегантное решение, и оно определяет множество страниц по умолчанию, но это делает работу.

ответ

7

это не так просто, как вы думаете это.

Есть несколько сценариев, о которых вы должны думать, когда делаете такие вещи. Например ...

Сценарий:

  1. Анонимный пользователь заходит на ваш сайт домашней страницы.
  2. Пользователь нажимает «Войти».
  3. Контактные данные пользователя.
  4. Куда направляют система?

Сценарий B:

  1. Анонимный пользователь обращается ваш сайт с помощью какой-то глубокой связи, кроме домашней страницы.
  2. Пользователь нажимает «Войти».
  3. Контактные данные пользователя.
  4. Куда направляют система?

Сценарий C:

  1. посещение пользователя какая-то глубокая ссылка, кроме домашней страницы, ранее прошедшей проверки подлинности на веб-сайт и по-прежнему имеет действительные кук аутентификации.
  2. Адрес, на который указывает пользователь?

Я немного спешу, поэтому, вероятно, трудно понять, о чем я говорю. Дело в том, что вам нужно подумать о том, как пользователь может получить доступ к вашему сайту. Как правило, я подключаю такие функции к процессу регистрации и входа в систему.Вы не сможете делать то, что хотите, с маршрутизацией.

+0

Я получил все эти сценарии, каждый пользовательский тип входа перенаправляется на конкретную actionlink (также включенную в зону безопасности). Все, что мне нужно, это использовать разные страницы по умолчанию для разных типов пользователей, которые подключены в текущем сеансе. сейчас моя страница по умолчанию - это страница входа в систему, но если куки-пользователь попадает на мой сайт, его страница по умолчанию не должна быть страницей входа ... это просто .. непрофессионально. Если все эти маршруты не будут в Login ActionResault, которые могут работать, и я попробую сейчас, хотя я бы предпочел бы более элегантный способ сделать это. Благодарю. – Maratto

+0

Если аутентифицированный пользователь приземлился на мое действие HomeController.Index, я делаю if (User.IsInRole (...)) {RedirectToAction (...); } в действии индекса. –

+0

Да, это именно то, что я сделал. (Обновлено мое сообщение) – Maratto

4

Одним из способов решения этой проблемы заключается в создании «Base» контроллер, от которого все ваши другие контроллеры наследуют. В этом контроллере вы можете написать свои операторы IF/CASE, и вы можете переопределить методы Initialize, OnActionExecuting и OnResultExecuting базового контроллера, чтобы перенаправить туда, где вы хотите, чтобы ваш пользователь закончил работу на основе вашей логики.

Так в основном вы бы создать базовый контроллер, как это:

public class BaseController : Controller 
{ 
    protected string RedirectPath = string.Empty; 
    protected bool DoRedirect = false; 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     // Your logic to determine whether to redirect or not goes here. Bellow is an example... 
     if (requestContext.HttpContext.User.IsInRole("RoleName")) 
     { 
     DoRedirect = true; 
     RedirectPath = Url.Action("SomeAction", "SomeController"); 
     } 
    } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 
     if (DoRedirect) 
     { 
      // Option 1: TRANSFER the request to another url 
      filterContext.Result = new TransferResult(RedirectPath); 
      // Option 2: REDIRECT the request to another url 
      filterContext.Result = new RedirectResult(RedirectPath); 
     } 
    } 
} 

А потом каждый из контроллера, который должен придерживаться этой роли пользователя редиректа логика должна наследовать от BaseController:

public class HomeController : BaseController 
{ 
    // Controller logic here... 
} 
+0

Я видел решение раньше для разных _Layouts, могу ли я использовать это решение для этой цели? Я имею в виду определить разные маршруты по умолчанию для разных пользователей? если это так, я бы очень понравился для краткого примера. – Maratto

+0

Что именно вы пытаетесь достичь? Это не будет определять разные маршруты по умолчанию. Он по существу перенаправит пользователя на другой маршрут, если пользователь будет в некоторой роли ... Будет ли это работать на вас? – Marko

+0

Да, это именно то, что мне нужно. – Maratto

Смежные вопросы