【问题标题】:Only allow access to action if redirected from specific action仅在从特定操作重定向时才允许访问操作
【发布时间】:2011-04-21 07:57:54
【问题描述】:

有没有一种很好的方法来限制对某个操作的访问,所以只有当您从另一个操作被重定向时才能访问它。例如:

    [HttpPost]
    public virtual ActionResult Create(MyViewModel vm)
    {            
        if (ModelState.IsValid)
        {
            // do some work

            return RedirectToAction("CreateSuccess");
        }
        else
        {
            return View(vm);
        }
    }


    public virtual ActionResult CreateSuccess()
    {
        // only allow execution if you were redirected from Action "Create" 
    }

【问题讨论】:

  • 如果只允许从 Create 执行,那么私有方法在这种情况下也不会起作用。我可以看到 PGR 模式,但你可以偏离。

标签: c# .net asp.net-mvc asp.net-mvc-2


【解决方案1】:

一种简单的方法是在第一种方法中将标志存储在TempData 中,并检查该标志是否存在于重定向到的方法中。
TempData 用于在操作请求之间传递状态信息,并且只会持续请求的持续时间,因此您无需担心将其清除。

【讨论】:

  • 小心一些重定向方法将 TempData 标记为跨请求保留和持久化。 Here 更多详情。似乎很旧,但我今天发现的情况仍然如此;)
【解决方案2】:

除非您包含指示此类的参数,否则无法知道“来自”操作。最简单的方法是附加一个“SourceAction”或“FromAction”参数并在“destination”操作中检查它。

【讨论】:

    【解决方案3】:

    问题是,你为什么要这样做?也许对于您的主要问题有更好的解决方案。

    无论如何,你可以使用 HttpContext.Current.Request.UrlReferrer 属性来查看上一页的 Url。

    【讨论】:

    • 原因是我想显示一些信息,这些信息应该只对成功(并因此授权)执行先前操作的人可见
    • 然后我会做 Andy Rose 所做的事情,但使用 TempData 的 Session。通过使用 Session 您告诉您的应用程序当前用户已经执行了给定的操作并且他能够执行该操作。如果您想使用该信息的时间超过 Session,甚至可以将其放在数据库中。
    • 依赖 HTTP Referrer 标头并不理想,因为它很容易被欺骗,并且一些代理和防火墙会删除此标头。
    【解决方案4】:

    第一个解决方案

    你可以这样做:

    [HttpPost]
    public virtual ActionResult Create(MyViewModel vm)
    {            
        if (ModelState.IsValid)
        {
            // do some work
            return this.CreateSuccess();
        }
        else
        {
            return View(vm);
        }
    }
    
    [NonAction]
    public virtual ActionResult CreateSuccess()
    {
        // do what's needed 
    }
    

    最后一个方法只会从其他操作方法中执行。但它本身不能执行。

    第二种解决方案

    如果您知道可以重用它,也可以通过创建自定义操作方法选择器属性来解决此问题。您可以编写一个自定义操作方法选择器属性来检查请求引荐来源并使用适当的方法。

    了解custom action selector attributes

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2011-08-04
      相关资源
      最近更新 更多