1

场景:我的应用程序运行查询,其中在许多情况下使用用户 ID 来过滤用户可以看到的数据。用户 ID 是一个整数。我不希望用户能够简单地更改查询字符串并将用户 ID 参数更改为另一个 # (并且基本上假设另一个用户的身份)。通过我们的身份验证过程,对服务器的每个请求都在标头中包含一个安全令牌,该令牌在客户端登录时返回给客户端。在身份验证过程中,此令牌存储在服务器上并映射到用户的用户ID。

我想做的是将令牌从标头中拉出,进行查找并获取映射到令牌值的用户 ID(使其正常工作),然后更改查询字符串以添加用户 ID。

所以一个请求可能会作为

http://localhost/api/app/customerlist

在我得到用户 ID 后,它可能看起来像这样

http://localhost/api/app/customerlist?$filter=userid%20eq%1234

然后继续。

这是一个简单的场景,但说明了我的目标。我无法将代理键添加到数据库并使用 GUID 或其他值作为我的过滤器列。几乎被结构卡住了。

谢谢

4

2 回答 2

1

在服务器端,您可以将任何过滤器直接添加到返回的任何 IQueryable 中。如果您使用授权属性,您还可以通过“用户”变量访问用户数据。

[BreezeController]
[Authorize]
public class NorthwindIBModelController : ApiController {

   [HttpGet]
   public IQueryable<Customer> CustomerList() {
     var userName = User.Identity.Name;

     var filter = filter on customers;
     var custs = ContextProvider.Context.Customers.Where({ some filter using userName});
   }

}

另请参阅:
将用户名传递给 ASP.NET MVC 4 中的 Web Api 方法

于 2013-10-19T22:22:45.037 回答
0

看一下 EntityQuery.withParameters 方法。使用来自客户端的它,您可以进行任何查询并将您的用户 ID 过滤器添加到其中。就像是

 myQuery = myQuery.withParameters( { userId: 1234});
 myEntityManager.executeQuery(myQuery).then(...); 

或者我错过了什么。

于 2013-10-19T02:29:32.383 回答