2011-03-27 34 views
3

我有一個使用ASP.NET MVC 3開發的面向公衆的網站.MVC應用程序包含帶有返回JSON操作的控制器。網頁針對返回JSON的操作執行AJAX請求。如何保護對返回JSON的MVC操作的訪問

即使使用JSON操作發佈的數據不敏感,但它是專有的,我擔心任何人都可以通過跨域調用或自定義應用程序調用返回JSON的操作。有沒有辦法讓我的MVC應用程序網頁訪問返回JSON的操作? ODATA是否提供解決此問題的任何好處?

有誰知道資源描述這個問題是一個負債,以及如何解決它?

回答

6

如果您的應用程序是公開的,那麼它更棘手。有ValidateAntiForgeryToken屬性可以幫助抵禦XSS和隨機請求。

如果您有密碼保護的網站,請使用Authorize屬性。

OData具有與MVC網站相同的一組問題。

0

我有一個類似的設置,但在我的iOS設備必須與JSON響應的頁面進行通信。我最終創建了一個ActionFilterAttribute,驗證設備是否通過其UDId添加到允許的設備列表中,並且2)分配給設備的用戶是活動的(當前使用)。問題是,這迫使我進入POST請求,對我來說這真的不是問題,但對你來說可能是因爲你可能允許GET請求。我也可能是錯的,我認爲模型聯編程序仍然會解析來自GET請求的對象,並且過濾器可能仍然有效。

總之,這裏的代碼到我的過濾器,因爲它是,修改您認爲合適的:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
internal sealed class VerifyDeviceAttribute : ActionFilterAttribute { 
    [Inject] 
    public DeviceProvider DeviceProvider { private get; set; } 

    public override void OnActionExecuting(
     ActionExecutingContext ActionExecutingContext) { 
     string UDId = ActionExecutingContext.HttpContext.Request.Form["Authorization.UDId"]; 

     if (this.DeviceProvider.Exists(UDId) && !this.DeviceProvider.Get(UDId).User.Active) { 
      ActionExecutingContext.Controller.ViewData.ModelState.AddModelError("User", "The user is not active"); 
     } else if (!this.DeviceProvider.Exists(UDId)) { 
      ActionExecutingContext.Controller.ViewData.ModelState.AddModelError("UDId", "The UDId is empty"); 
     }; 
    } 
} 

您可能注意到,我推着錯誤到控制器ModelState,如果有任何,而在操作結果在格式化響應之前,我總是檢查模型狀態,因此請確保始終檢查您的ModelState

1

如果您使用的是角色,則可以使用授權屬性限制訪問。

0

如果您確實想要獲得安全,您可以像處理數據庫一樣處理返回JSON的控制器,並將其部署到位於防火牆後面的單獨應用程序,而前端邊緣服務器位於DMZ。

客戶端可以連接到前端Web服務器,後者又調用防火牆後面的JSON資源。客戶端不能直接連接到JSON資源。

0

可以使用ValidateAntiForgeryToken防止人們發出請求到你的方法但是因爲你的數據的客戶端的工作還有其他的方式爲他們一旦被髮送到客戶端來訪問您的數據過多。您可以做的很少(如果有的話),以防止您允許公開訪問的數據或信息以某種方式被開採