Jquery Ajax在ASP.NET MVC中调用安全性

时间:2012-07-26 15:35:25

标签: asp.net-mvc json jquery

我的应用程序使用jQuery Ajax帖子来保存和更新记录。

我的所有帖子都使用JSON.stringify,如下所示:

jQuery.ajax({
                url: '@Url.Content("~/Vendor/SaveProvider")/',
                type: 'POST',
                contentType: 'application/json',
                dataType: 'json',
                data: JSON.stringify(
                 {

                     jsonProvider: ko.toJSON(appViewModel.provider),
                     jsonAddresses: ko.toJSON(appViewModel.addresses),
                     jsonContacts: ko.toJSON(appViewModel.contacts)
                 }),

我读到ASP.NET MVC附带了一个 ValidateAntiForgeryToken 过滤器用于控制器调用,但我找不到任何关于如何使用Jquery Ajax和JSON.stringify使其工作的资源...

所以,我想到了这个想法,想知道它是否可以......

我知道jQuery.Ajax允许你发送额外的头信息,所以我会这样做:

  1. 将创建自定义过滤器控制器
  2. 此过滤器将检查我当前的会话是否为NULL,并将检索用户首次登录Web应用程序时创建的“sessionlogid”(GUID)。
  3. 将获取使用包含该帖子的Jquery Ajax发送的自定义标头值 “sessionlogid”并将查看其值是否相同。
  4. 如果相同的值则让控制器移动,否则会发送错误。
  5. 我的过滤器应如下所示:

    public class ValidateAjaxSessionAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Request.Headers["sessionlogid"] == null ||
                filterContext.HttpContext.Request.Headers["sessionlogid"] != Session["sessionlogid"])
            {
                throw new ArgumentNullException("Invalid Request", new Exception());
            }
        }
    }
    

    这有意义还是有更好的方法来保护应用程序?

    感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

如果使用帖子

[Authorize]
[ValidateAntiForgeryToken]

如果是一个使用

[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;
    }
}

Then decorate your action as below
[Authorize]
[HttpAjaxRequest]
public ActionResult FillCity(int State)
{
    //code here
}