Я хочу обойти мой [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 Я добавил некоторую информацию к вопросу, сэр, я просто хочу выполнить jsonresult, не заходя в систему.
Вы можете поместить атрибуты в определенные методы контроллера, которые вы хотите использовать, а не во всем классе контроллера.
@Jonathan Да, это мое последнее средство, потому что внутри моего контроллера у меня есть 20 классов для разделения [sessionexpire].
@ Джонатан, ты удалил свой ответ. Он работает, и я добавил «еще» из вашего кода. Поискал и дал ссылку на ответ. Большое спасибо!
Я удалил его, потому что, когда я снова посмотрел на него, я подумал, что это вряд ли сработает. Я думал, что метод атрибута будет вызываться дважды; один раз для метода и один раз для класса. Я снова добавлю свой ответ. ?





Я не знаю, сработает ли это, но что, если вы поместите туда дополнительное свойство, а затем пропустите данные по методу один, который является исключением? Что-то вроде:
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
Когда ты хочешь это сделать? Всегда? Если да, то, может быть, настроить тайм-аут?