Различные страницы/контроллеры по умолчанию для каждого типа роли - MVC 5

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

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

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

Значит, это довольно простое "if", но я тем временем использовал метод User.IsInRole( "RoleName" ), который нельзя использовать в RouteConfig.cs.

Если это простое добавление оператора Использование, я заранее извиняюсь за простоту вопроса.

Обновление: Мне удалось сделать это через несколько:

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

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

Ответ 1

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

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

Сценарий A:

  • Анонимный пользователь приходит на домашнюю страницу вашего сайта.
  • Пользователь нажимает "Войти".
  • Вход пользователя.
  • Где система направляет пользователя?

Сценарий B:

  • Анонимный пользователь обращается к вашему сайту через некоторую глубокую ссылку, отличную от главной страницы.
  • Пользователь нажимает "Войти".
  • Вход пользователя.
  • Где система направляет пользователя?

Сценарий C:

  • Пользователь посещает некоторую глубокую ссылку, отличную от главной страницы, которая ранее была аутентифицирована на веб-сайте, и все еще имеет действительный файл cookie для проверки подлинности.
  • Где веб-сайт направляет пользователя?

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

Ответ 2

Один из способов решить это - создать "базовый" контроллер, из которого наследуются все остальные контроллеры. В этом контроллере вы можете написать свои операторы 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...
}