2012-07-26 60 views
0

我有我的應用程序使用jQuery Ajax帖子來保存和更新記錄。Jquery Ajax調用ASP.NET MVC中的安全性

我所有的職位透過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. 這個過濾器會檢查我的當前會話不爲空,將retrive一個「sessionlogid」(GUID),這是當用戶創建首先登錄到Web應用程序。
  3. 將獲得使用Jquery Ajax post發送的包含 「sessionlogid」的自定義標頭值,並將查看它是否具有相同的值。
  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()); 
     } 
    } 
} 

這是否有道理或有保護的應用程序沒有更好的辦法?

感謝您的幫助!

+0

你爲什麼這樣做字符串化和剛剛離開原樣? – Omu 2012-07-26 22:53:30

+0

因爲我使用敲除,似乎是控制器獲取信息的唯一方法。 – VAAA 2012-07-27 01:36:16

回答

0

如果其使用後

[Authorize] 
[ValidateAntiForgeryToken] 

如果一個GET使用

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