Как обойти атрибут [SessionExpire] на контроллере

Я хочу обойти мой [SessionExpire], который имеет перенаправление для входа в систему. Я хочу обойти атрибут, чтобы выполнить его без входа в систему.

Пользовательский атрибут, как показано:

public class SessionExpireAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;
            // check  sessions here
            if ( HttpContext.Current.Session["username"] == null ) 
            {
               filterContext.Result = new RedirectResult("~/Account/Login");
               return;
            }
            base.OnActionExecuting(filterContext);
        }
    }

//SAMPLE IMPLEMENTATION:


[SessionExpire]
public class HomeController : Controller
{
  public ActionResult Index()
  {
     return Index();
  }
//I WANT TO BYPASS THIS JSONRESULT WITHOUT GOING TO SESSIONEXPIRE
  public JsonResult Result()
  {

     return Json();
  }

}

Когда ты хочешь это сделать? Всегда? Если да, то, может быть, настроить тайм-аут?

Jonathan 30.07.2019 00:57

@Jonathan Я добавил некоторую информацию к вопросу, сэр, я просто хочу выполнить jsonresult, не заходя в систему.

Francis Lim 30.07.2019 01:02

Вы можете поместить атрибуты в определенные методы контроллера, которые вы хотите использовать, а не во всем классе контроллера.

Jonathan 30.07.2019 01:11

@Jonathan Да, это мое последнее средство, потому что внутри моего контроллера у меня есть 20 классов для разделения [sessionexpire].

Francis Lim 30.07.2019 01:13

@ Джонатан, ты удалил свой ответ. Он работает, и я добавил «еще» из вашего кода. Поискал и дал ссылку на ответ. Большое спасибо!

Francis Lim 30.07.2019 01:35

Я удалил его, потому что, когда я снова посмотрел на него, я подумал, что это вряд ли сработает. Я думал, что метод атрибута будет вызываться дважды; один раз для метода и один раз для класса. Я снова добавлю свой ответ. ?

Jonathan 30.07.2019 05:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
198
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я не знаю, сработает ли это, но что, если вы поместите туда дополнительное свойство, а затем пропустите данные по методу один, который является исключением? Что-то вроде:

public class SessionExpireAttribute : ActionFilterAttribute
{
    public bool IsIgnore {get;set;}

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (IsIgnore)
            base.OnActionExecuting(filterContext);

        HttpContext ctx = HttpContext.Current;
        // check  sessions here
        if ( HttpContext.Current.Session["username"] == null ) 
        {
           filterContext.Result = new RedirectResult("~/Account/Login");
           return;
        }
        base.OnActionExecuting(filterContext);
    }
}

//SAMPLE IMPLEMENTATION:


[SessionExpire]
public class HomeController : Controller
{
  public ActionResult Index()
  {
   return Index();
  }
//I WANT TO BYPASS THIS JSONRESULT WITHOUT GOING TO SESSIONEXPIRE
  [SessionExpire(IsIgnore = true)]
  public JsonResult Result()
  {
     return Json();
  }
}

Отвечает Джонатан:

Передача пользовательского параметра в настраиваемый атрибут. Ссылка здесь

Спасибо!

Здесь вы пытаетесь проверить, аутентифицирован ли пользователь, но довольно нестандартным способом. Официальная документация довольно обширна, поэтому я рекомендую прочитать https://docs.microsoft.com/en-us/aspnet/core/security/?view=aspnetcore-2.2 .

В вашем случае я бы рекомендовал реализовать IAuthorizationFilter и использовать Аллованонимусаттрибуте. чтобы обойти аутентификацию.

Также вы можете улучшить UX, перенаправив пользователя обратно на страницу, к которой он пытался получить доступ до аутентификации. Например, если пользователь попытался перейти к /orders, но он не прошел аутентификацию, он будет перенаправлен на /account/login, и после аутентификации он должен автоматически вернуться к /orders. Для этого вы можете использовать параметр: /account/login?redirect=orders

Другие вопросы по теме

Похожие вопросы