Как работает RedirectToRouteResult? - PullRequest
6 голосов
/ 22 октября 2010

В настоящее время я использую RedirectToRouteResult следующим образом:

public void OnAuthorization(AuthorizationContext filterContext)
{
    User user = filterContext.HttpContext.Session["user"] as User;
    if (user == null || user.Role != expectedRole)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary {
                {"controller", _controller}, {"action", _action}
        });
    }
}

Этот код входит в мой класс CheckLoginAttribute.

Я собираюсь использовать его в качестве декоратора для определенных действий контроллеранапример:

[CheckLogin(RolesEnum.Member, "MyController", "MyAction")]
public JsonResult GetNews()

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

Будет RedirectToRouteResult перенаправлять на соответствующую сторону сервера действий без необходимости выполнять большой цикл на стороне клиента (например, переписывать URL-адрес окнаместоположение или что-то подобное)?Это так работает?

Ответы [ 3 ]

4 голосов
/ 22 октября 2010

Ну, я понял это сам.

Так что, по сути, мне нужно было не «перенаправление».Я искал не в том месте, чтобы решить мою проблему.Я знал, что перенаправление означало, что мне нужно было совершить несколько поездок клиент / сервер только для того, чтобы иметь возможность вернуть результат json, и это было неправильно.

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

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

Конечное решение:

    public class CheckLoginAttribute : AuthorizeAttribute, IAuthorizationFilter
{

    private RolesEnum expectedRole;

    public CheckLoginAttribute(RolesEnum role)
    {
        expectedRole = role;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        User user = filterContext.HttpContext.Session["user"] as User;
        if (user == null || user.Role != expectedRole)
        {
            filterContext.Result = new JsonResult()
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new LoginMessage() { IsValidLogin = false }
            };
        }
    }
}

И теперь я могу украсить свои методы действия с помощью этого:1014 * Немного больше кода, чтобы избежать кражи сеанса ASP.NET, и все готово.

Надеюсь, это кому-нибудь поможет.Спасибо.

1 голос
/ 22 октября 2010

Нет - RedirectXXXResult всегда возвращает HTTP 302 .Это не эквивалент Server.Transfer ().

0 голосов
/ 04 июля 2014

Ваше решение не является надежным и усложняет клиентский код;Не говоря уже о накладных расходах на поддержку этого кода для всех типов клиентов.

При возврате JSON код состояния ответа будет 200. Это означает, что вам потребуется добавить логику безопасности для каждого вашего клиента для интерпретациикаждый ответ для обнаружения несанкционированного доступа.Используйте фильтр авторизации.

http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx

ПРИМЕЧАНИЕ:

"Если неавторизованный пользователь пытается получить доступ к методу, помеченному атрибутом Authorize, среда MVC возвращаеткод состояния HTTP 401. Если сайт настроен на использование проверки подлинности на основе форм ASP.NET, код состояния 401 заставляет браузер перенаправить пользователя на страницу входа. "

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