在处理之前更改控制器中的breeze查询字符串

时间:2013-10-19 01:33:13

标签: filter controller breeze

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

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

所以请求可能会以

的形式出现
http://localhost/api/app/customerlist

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

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

然后继续。

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

由于

2 个答案:

答案 0 :(得分: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});
   }

}

另见:
Passing username to Web Api methods in ASP.NET MVC 4

答案 1 :(得分:0)

看看EntityQuery.withParameters方法。通过它从客户端,您可以进行任何查询并添加您的用户ID过滤器。像

这样的东西
 myQuery = myQuery.withParameters( { userId: 1234});
 myEntityManager.executeQuery(myQuery).then(...); 

或者我错过了什么。