场景:我的应用运行查询,在许多情况下使用用户ID来过滤用户可以看到的数据。用户标识是整数。我不希望用户能够简单地改变查询字符串并将用户ID parm更改为另一个#(并且基本上假设另一个用户的身份)。通过我们的身份验证过程,每个对服务器的请求都在标头中包含一个安全令牌,在登录时返回给客户端。在身份验证过程中,此令牌存储在服务器上并映射到用户的用户ID。
我想要做的是将标记从标题中拉出来,进行查找并获取映射到标记值的用户标识(使其正常工作),然后更改查询字符串以添加用户标识。
所以请求可能会以
的形式出现http://localhost/api/app/customerlist
在我获得用户ID后,它可能看起来像这样
http://localhost/api/app/customerlist?$filter=userid%20eq%1234
然后继续。
这是一个简单的场景,但说明了我的目标。我无法将代理键添加到数据库并使用GUID或其他值作为我的过滤器列。几乎坚持结构。
由于
答案 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});
}
}
答案 1 :(得分:0)
看看EntityQuery.withParameters方法。通过它从客户端,您可以进行任何查询并添加您的用户ID过滤器。像
这样的东西 myQuery = myQuery.withParameters( { userId: 1234});
myEntityManager.executeQuery(myQuery).then(...);
或者我错过了什么。