0

我的应用程序使用 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. 将获取与包含该“sessionlogid”的 Jquery Ajax 帖子一起发送的自定义标头值,并将查看其是否相同。
  4. 如果它的值相同,则让控制器离开,否则将发送错误。

我的过滤器应该是这样的:

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());
        }
    }
}

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

感谢你的帮助!!

4

1 回答 1

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
}
于 2017-08-24T15:04:42.273 回答