【问题标题】:How to bypass [SessionExpire] attribute on a Controller如何绕过控制器上的 [SessionExpire] 属性
【发布时间】:2019-07-29 22:55:37
【问题描述】:

我想绕过我的 [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]。
  • @Jonathan 你删除了你的答案。它正在工作,我从您的代码中添加了“else”。搜索它并给出答案的链接。非常感谢!

标签: c# asp.net


【解决方案1】:

我不知道这是否可行,但是如果您在其中放置一个额外的属性,然后通过 one 方法传递数据,那会是例外吗?比如:

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

【讨论】:

    【解决方案2】:

    乔纳森回答:

    在自定义属性中传递自定义参数。 链接here

    谢谢!

    【讨论】:

      【解决方案3】:

      您在这里尝试做的是检查用户是否经过身份验证,但以一种相当自定义的方式。官方文档相当扩展,所以我建议阅读 https://docs.microsoft.com/en-us/aspnet/core/security/?view=aspnetcore-2.2.

      根据您的情况,我建议实施IAuthorizationFilter 并使用AllowAonymousAttribute。绕过身份验证。

      您还可以通过将用户重定向回它在身份验证之前尝试访问的页面来改善用户体验。例如,如果用户试图导航到/orders,但他没有通过身份验证,他将被重定向到/account/login,一旦他通过身份验证,他应该自动返回/orders。您可以为此使用参数:/account/login?redirect=orders

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 2015-08-04
        • 2021-10-01
        相关资源
        最近更新 更多