2017-02-14 23 views
2

Я работаю над проектом asp.net mvc5, моя проблема заставляет пользователя войти в систему, после чего они могут что-то делать на моем сайте. Я использую сеанс для проверки входа пользователя или нет (я не использую идентификатор или авторизацию). Вот мой Войти код:Как я могу принудительно ввести логин пользователя перед тем, как перейти в любое место в моем приложении?

[HttpPost] 
    public ActionResult Login(User user) 
    { 
     if (IsValid(user.username, user.password)) 
     { 
      Session["username"] = user.username; 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      ModelState.AddModelError("", "Login details are wrong."); 
     } 
     return View(user); 
    } 

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

public ActionResult Index() 
    { 
     if (Session["username"] != null) 
     { 
      //then user can go anywhere with any link 
     } 
     else 
     { 
      //user cannot go to here without login 
     } 
    } 

Существует ли способ заставить пользователя для перенаправления на страницу входа в систему (если они не войти в систему) при нажатии на любую ссылку или введите ссылку в браузере? Я искал конфигурацию маршрута или конфигурацию фильтра, но, похоже, это не решило мою проблему. Я надеюсь, что есть общий способ сделать это, не добавляя контрольный код вручную каждому контроллеру/действию.

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

+0

Попробуйте перенаправить его на стартовую страницу, если сеанс отсутствует. – WasteD

+0

@WasteD Я могу проверить и перенаправить пользователя на страницу входа, но мне нужно скопировать код входа обнаружения на любой контроллер или действие, которое может принести пользователь. Это будет окончательный путь, если я не смогу это решить. Мне нужно знать, есть ли вообще более общий, чем мой указанный код. В любом случае, Спасибо, что ответили мне! –

ответ

1

Одним из возможных способов решения этой проблемы в глобальном масштабе является переопределение метода OnActionExecuting на контроллере, который выполняет проверку и перенаправляет на главную страницу, если ни один пользователь не зарегистрирован или не разрешает действие, если есть пользователь.

Это можно сделать на базовом контроллере, чтобы оно применимо ко всему веб-сайту (сделав все контроллеры наследуемыми от этого).

public abstract class LoginRequiredController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (Session["username"] != null) 
     { 
      base.OnActionExecuting(filterContext); 
     } 
     else 
     { 
      //Redirect to the main page, or login, or somewhere else, without running the requested action 
      filterContext.Result = Redirect("/"); 
      return; 
     } 
    } 
} 

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

Конечно, контроллер входа не должен наследовать от него, иначе было бы невозможно войти в систему.