Различные страницы/контроллеры по умолчанию для каждого типа роли - 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...
}
Ответ 3
Я предлагаю вам эту статью, которая может быть вам полезна.
https://www.simple-talk.com/dotnet/asp.net/thoughts-on-asp.net-mvc-authorization-and-security-/