Изменить путь запроса в фильтре действий в ASP.NET сердечник

У нас есть фильтр действия, ActionAuthorizationFilterAttribute , который выполняет некоторые тесты авторизации (получение его разрешений из сеанса, подробнее об этом позже) в своем методе OnActionExecuting, и если тесты в порядке, он просто возвращает, а если нет, он устанавливает ForbidResult на свойстве результата контекста. Пока все хорошо. Но у нас есть один случай, когда сеанс повторяет null для разрешений после некоторого периода времени простоя, и нам нужно установить путь запроса в«/», Вместо того, чтобы пользователь делал это вручную, так, например, если пользователь пытается получить доступ к некоторому url после окончания его сеанса, как http://mydomain/mywebapp/someurl , метод должен возвратить его к http://mydomain/mywebapp/, и приложение начнет свою сессию init материал снова. Это работает, когда делает это вручную, но это не работает в методе. Вот код для метода:

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);
    }

2 ответа

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

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

  2. 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);
    }