MVC перенаправить к действию, когда пользователь не авторизован

В настоящее время я работаю над настройкой разрешений для своего веб-приложения. Не всем нужен доступ к определенным страницам, таким как создание / редактирование / удаление (обычно) или добавление новых прав для пользователей. У меня есть таблица в моей базе данных, которая отслеживает пользователей и их роли / права. Я переопределяю AuthorizeAttribute. Я бы хотел, чтобы когда пользователь не авторизован для доступа к странице, он был перенаправлен обратно на страницу, на которой он был только что, и показывал предупреждение, что у них нет доступа.

Пример: если они находятся на домашней странице и нажимают кнопку «Добавить что-то новое», если у них нет прав, они будут перенаправлены обратно на домашнюю страницу с ошибкой.

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

Текущий настраиваемый метод AuthorizeAttribute HandleUnauthorizedRequest

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    filterContext.Result = new RedirectToRouteResult(
                                new RouteValueDictionary {
                                    { "action", filterContext.RouteData.Values["action"] },
                                    { "controller", filterContext.RouteData.Values["controller"] }
                                });
}

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


person C-Pfef    schedule 24.07.2015    source источник
comment
Я считаю, что вам лучше всего будет заголовок Referer (sic).   -  person klings    schedule 24.07.2015
comment
@klings Не могли бы вы немного уточнить?   -  person C-Pfef    schedule 24.07.2015
comment
Результат = новый RedirectResult (filterContext.HttpContext.Request.UrlReferrer)   -  person stephen.vakil    schedule 24.07.2015
comment
Заголовок реферера в запросе содержит URL-адрес, с которого пользователь перешел на текущий URL-адрес. Обратите внимание, что он не всегда может быть установлен, некоторые пользователи могли настроить свои браузеры так, чтобы не включать его из соображений конфиденциальности.   -  person klings    schedule 24.07.2015
comment
Спасибо! Пока у меня есть ты, ты знаешь, как я могу сделать всплывающее окно? Я знаю, что могу сделать это в каждом представлении с помощью javascript, но есть ли глобальный способ сделать это?   -  person C-Pfef    schedule 24.07.2015
comment
В общем, проверьте. Если он существует, отправьте их туда, если нет, перейдите на страницу с общей ошибкой.   -  person C-Pfef    schedule 24.07.2015


Ответы (1)


Используя советы Клингса и Стивена вакил, у меня есть:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    Uri requestUrl = filterContext.HttpContext.Request.UrlReferrer;
    if (requestUrl != null)
    {
        filterContext.Result = new RedirectResult(requestUrl.ToString());
    }
    else
    {
        filterContext.Result = new RedirectToRouteResult(
                                    new RouteValueDictionary {
                                        { "action", "NotAuthorized" },
                                        { "controller", "Admin" }
                                    });
    }
}

Если был реферер, верните их на эту страницу, но мне все равно нужно, чтобы всплывающее окно появлялось, когда они переходят на эту страницу. Я знаю, что это можно сделать в каждом отдельном представлении с помощью javascript и alert (), но я ищу что-то, что можно сделать в одном месте, не изменяя, если возможно, другие представления. Если нет, отправьте на общую страницу, указав, что они не авторизованы.

person C-Pfef    schedule 24.07.2015