【问题标题】:Restrict controller action from web site only仅从网站限制控制器操作
【发布时间】:2013-02-21 19:49:54
【问题描述】:

是否可以将我的操作方法的控制器操作访问权限限制为仅限 AJAX 请求?

我的意思是一个非 Ajax 操作请求将被重定向到 404 或抛出错误。如果 JS 在我自己的页面上发出请求,操作只会返回正确的结果。

我尝试谷歌搜索,但没有找到答案。我了解到我可以为此目的实现自定义过滤器,但也许它已经存在于 MVC 中?

谢谢。

【问题讨论】:

  • 我对你的意图有点迷茫。您想阻止来自未经身份验证或错误角色用户的未经授权的请求吗?
  • 我只想阻止直接请求操作(当有人在浏览器 URL 栏中键入“www.mysite.com/controller/action”时)。
  • HttpPostAttribute 足以阻止浏览器栏;)
  • @Olexander,OP 可以接受非 Ajax 帖子吗?
  • @DaveA,是的,他们会的,而且您的回答绝对正确,而且,您的解决方案不会导致可能重写现有的 jquery $.get()$.getJSON() 请求。但考虑到上面的评论(关于浏览器 URL 栏),POST 请求是 @AlexDn 试图达到的(看起来像:)。这就是为什么我只留下评论而不是帖子;)

标签: javascript jquery asp.net ajax asp.net-mvc


【解决方案1】:

创建自定义操作方法选择器以阻止非 Ajax 调用

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request.IsAjaxRequest();
    }
}

您的属性将以经典方式应用

[AjaxOnly]
public ActionResult Index()
{

或者你可以将它应用到你的控制器

[AjaxOnly]
public class HomeController : Controller
{

我不确定我是否会建议您将用户发送到 404,但与往常一样,只有开发人员才能了解他们的要求。因此,我建议您考虑是否希望以“更柔和”的方式重定向到警告页面。

【讨论】:

  • @IamStalker,今天感觉自己被划定了
  • 看来我需要创建我的属性来完成它。除了 IsAjaxRequest,我将检查请求是否来自我的站点(url-refferer 或类似的东西)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多