保护ASP.NET MVC控制器

时间:2015-04-08 17:16:47

标签: asp.net asp.net-mvc asp.net-mvc-4

我有一个带有HomeController,ContactController等控制器的ASP.NET MVC 4应用程序,它匹配常规网站页面(视图)等。

我有一个名为 LogicController 的特殊控制器,在这个控制器中,我的所有业务逻辑都以函数和过程的形式存在,通常返回JSON对象。

我通过使用对/ Logic / FunctionName的jQuery Ajax调用来使用这个逻辑。

例如,如果我想获得我将使用的所有客户的列表/ Logic / GetCustomerList,它反过来返回JSON格式的客户列表。

$.ajax({
        type: "POST",
        url: "/Logic/GetCustomerList",
        async: true
});

这里没什么新东西。

现在,如果在我的网络浏览器中我导航到www.mywebsite.com/Logic/GetCustomerList,我怀疑是否会获得在浏览器中呈现的客户列表(JSON)。

所以我的问题是如何保护对这个控制器的访问,所以只有来自应用程序内部的调用(通过jquery ajax)可以命中控制器,但是在这种情况下“外部”或直接调用会被拒绝?

2 个答案:

答案 0 :(得分:0)

此外,如果只有登录用户可以访问此方法,您可以使用

进行装饰
[Authorize]

或者,如果所有操作只能由登录用户访问,则可以使用此属性修饰整个类。

答案 1 :(得分:0)

这是一种确保您的操作只能由Ajax调用访问的简单方法(至少对于没有如何创建手动HTTP调用的技术知识的任何人):

using System.Web.Mvc;

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

现在您可以使用新属性简单地修饰您的操作方法:

[AjaxOnly]
public ActionResult DoStuff()
{
    //snip
}