保护ASP.NET MVC应用程序中的ajax调用

时间:2012-08-22 22:03:18

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

我有一个基于ASP.NET MVC的应用程序,允许根据用户的不同访问级别。它当前的工作方式是当用户访问页面时,对数据库进行检查以确定用户拥有的权限。然后根据用户的访问级别选择视图。有些用户看到的数据比其他用户更多,并且可以使用更多功能。每个页面还会进行各种ajax调用,以显示和更新页面上显示的数据。

我的问题是,确保特定的ajax调用来自视图并且未手动制作以返回或更新用户无权访问的数据的最佳方法是什么?我不希望每次进行ajax调用时都要去数据库重新检查,因为当用户最初加载页面时已经完成了。

4 个答案:

答案 0 :(得分:2)

查看Authorize Attribute,您可以将其放在整个控制器上,或只是控制器中的特定方法。

示例:

[Authorize(Roles = "Administrator")]
public class AdminController : Controller
{
 //your code here
}

public class AdminController : Controller
{
    //Available to everyone
    public ActionResult Index()
    {
        return View();
    }

    //Just available to users in the Administrator role.
    [Authorize(Roles = "Administrator")]
    public ActionResult AdminOnlyIndex()
    {
        return View();
    }
}

或者,您可以编写自定义Authorize属性来提供自己的逻辑。

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{           
    protected override bool AuthorizeCore(HttpContextBase httpContext)     
    {
        IPrincipal user = httpContext.User;     
        var validRoles = Roles.Split(',');//Roles will be a parameter when you use the Attribute        
        List<String> userRoles = GetRolesFromDb(user);//This will be a call to your database to get the roles the user is in.

        return validRoles.Intersect(userRoles).Any();
    }
} 

使用:

 [CustomAuthorizeAttribute(Roles = "Admin,Superuser")] 
 public class AdminController : Controller {

 }

答案 1 :(得分:0)

这取决于您使用的会话机制类型。您使用默认会员提供商吗?如果不是,您可以传递用户的id和sessionid,确保用户会话有效,并且用户具有进行该呼叫所需的权限。

答案 2 :(得分:0)

除了Authorize属性,您还可以仅允许使用自定义属性的Ajax请求,如here所示。

由于

答案 3 :(得分:0)

如果您正在使用帖子

[Authorize]
[ValidateAntiForgeryToken]

如果你使用了get use

[Authorize]

您也可以使用此自定义属性

public class HttpAjaxRequestAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        if (!controllerContext.HttpContext.Request.IsAjaxRequest())
        {
            throw new Exception("This action " + methodInfo.Name + " can only be called via an Ajax request");
        }
        return true;
    }
}

然后装饰你的行动如下

[Authorize]
[HttpAjaxRequest]
public ActionResult FillCity(int State)
{
    //code here
}

记住&#34; Mark / Tick&#34;如果这可以解决你的问题。