Перенаправление с контроллера инициализации не работает - PullRequest
10 голосов
/ 22 ноября 2011

У меня есть переопределение для контроллера, который проверяет, существуют ли определенные данные сеанса.Эти данные необходимы для правильной работы репозитория, поэтому, если он не существует, то после проверки пользователь должен выйти из системы.

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
    if (Session["CompanyID"] != null)
    {
        repo.CompanyID = (long)Session["CompanyID"];
    }
    else
    {
        RedirectToAction("LogOff", "Account");
    }
}

Мой код выглядит следующим образом, но даже когда RedirectToAction вызывается контроллеромпо-прежнему открывается действие по умолчанию, и пользователь не вышел из системы.Можете ли вы порекомендовать, как решить эту проблему?

Я использую эти данные сеанса таким образом, потому что это первое место, к которому я могу добраться, я знаю и здесь я могу проверить, существуют ли эти конкретные данные,Это записывается, когда пользователь входит в систему.

Эти данные являются частью пользователя в базе данных.Я сделал пользовательское членство и поставщик ролей.Есть ли способ как-то добавить эти данные к «Пользователю» типа MembershipUser, чтобы они могли быть доступны в конструкторе, например, username пользователя?

Ответы [ 2 ]

14 голосов
/ 22 ноября 2011

Попробуйте вместо этого использовать пользовательский ActionFilter .

public class HasCompanyIdAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Session["CompanyID"] == null)
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {action = "LogOff", controller = "Account"}));
        }
    }
}

Затем его можно применить так:

[HasCompanyId]
public class MyController : Controller 
{
    public ActionResult SomeAction()
    {
        return View();
    }
}

Это применит атрибут для всех запросов, которые обрабатывает MyController (или его подклассы).

2 голосов
/ 03 февраля 2012

Просто реализуйте свое решение, переопределив OnActionExcuting в базовом классе.Затем вы можете делать все, что можете, в Фильтре действий.Вот так:

public void OnActionExecuting(ActionExecutingContext filterContext){
  if (filterContext.HttpContext.Session["CompanyID"] != null)
     repo.CompanyID = (long)filterContext.HttpContext.Session["CompanyID"];
  else
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {action = "LogOff", controller = "Account"}));
}

Некоторый код опущен для краткости.

Я попробовал оба подхода и обнаружил, что реализация его через фильтр действий была более сложной из-за требований внедрения зависимостей, которые у меня были.Вы можете сделать это в любом случае, но почувствовали, что подход с базовым классом немного яснее.Я также хотел установить некоторые свойства базового класса, чтобы сделать несколько стандартных объектов доступными для методов контроллера, чтобы сохранить повторяющийся код, который DEV добавлял в действия.Подход базового класса сделал это простым.

Одно замечание, которое я добавлю: я не предполагаю, что это хороший подход к аутентификации / безопасности, я рассматриваю это исключительно с точки зрения желания выполнятьнекоторые операции / проверка перед выполнением действия, а также настройка некоторых предварительно заполненных данных на экземпляре контроллера в соответствии с принципом СУХОЙ.

Надеюсь, это поможет.

...