0

У нас есть действие фильтра, 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); 
    } 

ответ

0

Изменение Path в коде не будет перенаправлять пользователя на новый путь. Вы должны вернуть RedirectResult, если вы хотите, чтобы пользователь был перенаправлен на страницу индекса/входа.

Для API наилучшим вариантом является возвращение UnauthorizedResult.

+0

Мы не используем ASP.NET Core MVC. Мы используем ASP.NET Core с Web API, что означает, что наши контроллеры просто возвращают данные, а не представления. Все представления обрабатываются клиентом с помощью углового и ui-router. Будет ли ваше решение работать с нашей настройкой? Если это так, мне нужно изменить строку ** context.HttpContext.Request.Path = "/"; ** на ** context.Result = new RedirectResult ("/"); **? – ashilon

+0

Если вы хотите вернуть своему пользователю/клиенту некоторую «инструкцию», чтобы «сделать новый запрос на страницу индекса/входа» - вы должны что-то вернуть. Что-то, что ваш пользователь/клиент поймет. Что-то «задокументировано» (в ваших документах). Без этого (только путем изменения 'Request.Path') только ваш сервер« сделает »что-то« другое », а не клиент. Клиент «подумает», что его вызов, скажем, «/ api/create/magic» выполнен и создан магия, но это не так, если пользователь несанкционирован (из-за истечения срока действия сеанса/учетных данных). Imho, возвращающий 'UnauthorizedResult', является лучшим решением для вашего дела (обновленный мой ответ). – Dmitry

0
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.Result = new RedirectResult("your_url"); 
     return; 
    } 

    if (permittedUrls.Any(url => path.Contains(url.Trim().ToLower()))) 
    { 
     return; 
    } 

    context.Result = new ForbidResult(); //new UnauthorizedResult(); 

    base.OnActionExecuting(context); 
} 
+0

Спасибо ivamax9, но это решение не работает. Может быть, потому, что мы используем наши основные контроллеры asp.net в качестве сетевых api-контроллеров. – ashilon

Смежные вопросы