2011-09-01 25 views
0

我的MVC應用程序由管理員和普通用戶組成。管理員用戶可以使用系統註冊爲不同的客戶,並且可以將他們各自的用戶添加到系統中。如何最好地保護Mvc應用程序中的Json請求?

控制器已經在某些控制器上擁有授權過濾器,以防止未經授權訪問某些頁面/ json。

但是,說我有一個管理員用戶登錄,什麼阻止他們檢查Json帖子/獲取JavaScript並手動調用一個'獲取'與特定數據的ID'被查看?例如/ Users/1

測試我的應用程序,我可以發佈AJAX get,以檢索系統中未處於當前已通過身份驗證的用戶管理下的另一用戶的詳細信息。

無論何時調用服務方法以查看用戶是否可以查看數據,我都可以編寫訪問檢查方法。他們是否有任何解決這個問題的好方法,而不用在整個地方亂扔垃圾應用程序?

例如Current Implementation

public class PeopleController : ApplicationController 
{ 
    public ActionResult GetMemberDetails(int memberId) 
    {    
     var member = _peopleService.GetMemberById(memberId); 
     return Json(member, JsonRequestBehavior.AllowGet); 
    } 
} 

public class PeopleService : IPeopleService 
{ 
    public MemberModel GetMemberById(int memberId) 
    { 
     // Void function which throws Unauthorised exception 
     MemberAccessCheck(memberId); 

     var member = Mapper.Map<Member, MemberModel>(_memberRepository.GetById(memberId)); 
     return member; 
    } 
} 

MemberAccessCheck函數在我的服務中被調用很多次。

回答

1

你將不得不在你的控制器或服務中寫這些檢查。我不認爲你應該使用一個自定義的attributefilter這種行爲,因爲你基本上是從服務層的角度過濾數據。 Auhorize屬性也不適用於此功能。

我建議你有一個服務方法,它接受來自控制器的當前userId(接受User.Identity)並將其發送到服務以獲取用戶或單個用戶的列表,以便他們可以查看/修改。所以它不一定會亂扔垃圾,但它會是你的服務如何運作(一個商業規則)。

的服務方法如:

User GetAdminUser(int userId, int adminId); 
List<User> GetAdminUsers(int adminId); 

或者,只是超載你以前的服務

User GetUser(int userId); 
User GetUser(int userId, int adminId); 
+0

那麼我仍然需要在每個方法中接受來自Json請求的Ids的訪問檢查? – jaffa

+0

@jaffa,給你的控制器和例子 –

+0

我已經檢查了服務層,在被請求的記錄的id而不是在控制器上。這是最佳做法嗎? – jaffa

1

你應該考慮將所有的管理功能於一身的地區。如果這樣做,則可以使用區域路由實現RouteConstraint,它可以檢查AJAX請求中提交的ID,以確定它是否在請求用戶的範圍內。在該區域的AreaRegistration.cs文件假想的路線將如下所示:

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Admin_default", 
     "Admin/{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     new { id = new IsActionAuthorized() } 
    ); 
} 

然後,你會RouteConstraint這個樣子:

public class IsActionAuthorized : IRouteConstraint 
{ 
    public IsActionAuthorized() 
    { } 

    private MyEntities _db = new MyEntities(); 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     // return true if no id was submitted 
     if (String.IsNullOrEmpty(values[parameterName])) 
      return true; 

     // return true if action is authorized 
     var requestId = Convert.ToInt32(values[parameterName]); 
     var authorized = false; 

     // code to check against requester's id, to determine 
     // if requestedId is within requester's authority 
     // set authorized to true only if the request is authorized for this requester 

     return authorized; 
    } 
} 

這給你一個單一的入口點,您可以在哪裏進行必要的門衛測試。如果測試失敗,請求將失敗並返回404錯誤。

0

不過,說我有一個管理員用戶登錄,是什麼阻止他們 檢查JSON的職位/獲取的JavaScript和手動調用 一個「讓」與特定數據的ID來看待?例如/ Users/1

沒什麼,真的。

您可以對這些請求使用HTTPS,因此至少數據將被加密。

無論何時調用服務方法爲 來查看用戶是否可以查看數據,我都可以編寫訪問檢查方法。

您可能需要這樣做。在Web應用程序中,您不能相信發送給您的請求是有效的。

此代碼往往是非常特定於應用程序,所以沒有很多「框架」可以爲您處理它。您最好的選擇是以這種方式編寫代碼,在您需要的任何地方都可以輕鬆地將它們掛接到您的應用程序中。

相關問題