У нас есть действие фильтра, ActionAuthorizationFilterAttribute, который выполняет некоторые тесты авторизации (получение его разрешения от сессии, об этом позже) в методе OnActionExecuting, и если тесты в порядке, он просто возвращает, а если нет, то он устанавливает ForbidResult в контексте Результат. Все идет нормально. Но у нас есть один случай, когда сеанс возвращает нуль для разрешений после некоторого периода времени простоя, и нам нужно установить путь запроса к «/», вместо того, чтобы пользователь выполнял это вручную, так, например, если пользователь пытается получить доступ к некоторому URL-адресу после окончания сеанса, например http://mydomain/mywebapp/someurl, метод должен вернуть его в http://mydomain/mywebapp/, и приложение снова запустит свой материал для сеансов. Это работает, когда это делает это вручную, но в методе это не работает. Вот код для метода:Изменить путь запроса в фильтре действий в ASP.NET Ядра
public override void OnActionExecuting(ActionExecutingContext context)
{
var path = context.HttpContext.Request.Path.Value.Trim().ToLower();
var session = context.HttpContext.Session;
var permittedUrls = session.GetJson<List<string>>(SesstionStateKeys.PermittedUrls);
if (permittedUrls == null)
{
context.HttpContext.Request.Path = "/";
return;
}
if (permittedUrls.Any(url => path.Contains(url.Trim().ToLower())))
{
return;
}
context.Result = new ForbidResult(); //new UnauthorizedResult();
base.OnActionExecuting(context);
}
Мы не используем ASP.NET Core MVC. Мы используем ASP.NET Core с Web API, что означает, что наши контроллеры просто возвращают данные, а не представления. Все представления обрабатываются клиентом с помощью углового и ui-router. Будет ли ваше решение работать с нашей настройкой? Если это так, мне нужно изменить строку ** context.HttpContext.Request.Path = "/"; ** на ** context.Result = new RedirectResult ("/"); **? – ashilon
Если вы хотите вернуть своему пользователю/клиенту некоторую «инструкцию», чтобы «сделать новый запрос на страницу индекса/входа» - вы должны что-то вернуть. Что-то, что ваш пользователь/клиент поймет. Что-то «задокументировано» (в ваших документах). Без этого (только путем изменения 'Request.Path') только ваш сервер« сделает »что-то« другое », а не клиент. Клиент «подумает», что его вызов, скажем, «/ api/create/magic» выполнен и создан магия, но это не так, если пользователь несанкционирован (из-за истечения срока действия сеанса/учетных данных). Imho, возвращающий 'UnauthorizedResult', является лучшим решением для вашего дела (обновленный мой ответ). – Dmitry