Как перенаправить, выбрасывая исключения из контроллера Asp.NET? - PullRequest
3 голосов
/ 27 апреля 2010

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

Могу ли я сделать это, выдав исключение из этого метода? Как я могу вызвать перенаправление при возникновении этого исключения?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

Хотя я думаю, что вам следует изменить подход к решению относительно авторизации, вы можете остаться с ним и использовать этот код:

public partial class BaseUserAwareController : Controller
{
    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (GetCurrentUser() == null)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

Если ваш проект не слишком большой, подумайте об изменении его для использования [Authorize].Если бы вы использовали его, это было бы только:

[Authorize]
public partial class UserAwareController : Controller
{

}

Вы можете подумать, что это не такая большая разница, но [Authorize] обрабатывает также некоторые проблемы с кэшированием (возвращая кэшированный ответ, когда вы больше не авторизованы),

Установите MVC 2 и создайте новое веб-приложение MVC 2.Он содержит логику авторизации, которую вы можете использовать в своем приложении.

2 голосов
/ 27 апреля 2010

Почему бы просто не использовать методы Redirect или RedirectToAction для перенаправления на страницу входа:

public ActionResult GetCurrentUser()
{
  if (user is not logged in)
  {
      Redirect("/LoginPage");
   }
}

РЕДАКТИРОВАТЬ: Или выполнить проверку в базовом контроллере OnActionExecuting:

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (GetCurrentUser() == null)
        {
            (filterContext.Controller as BaseController).Redirect("/Login");
        }

        base.OnActionExecuting(filterContext);
    }

}

http://forums.asp.net/t/1239842.aspx также хорошая ссылка на эту тему.

1 голос
/ 27 апреля 2010

В вашем базовом контроллере переопределите OnActionExecuting. Это дает вам доступ к ActionExecutingContext, который содержит HttpContext и, следовательно, Response.

Затем вы можете перенаправить пользователя на основе любой логики, которую вы хотите, так:

<ActionContext>.HttpContext.Response.Redirect(<Your Url>)

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

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