2011-09-01 26 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应用程序中,您不能相信发送给您的请求是有效的。

此代码往往是非常特定于应用程序,所以没有很多“框架”可以为您处理它。您最好的选择是以这种方式编写代码,在您需要的任何地方都可以轻松地将它们挂接到您的应用程序中。

相关问题