假设我使用此处描述的自定义过滤器属性实现了基于令牌的授权。
我们还假设,我有一个返回任务的控制器:
public IEnumerable<Task> Get()
{
// return tasks for authorized user
}
现在,我将如何只为授权用户返回任务?将用户 ID 作为查询参数传递不是一种选择 - 禁止请求其他用户的任务。
假设我使用此处描述的自定义过滤器属性实现了基于令牌的授权。
我们还假设,我有一个返回任务的控制器:
public IEnumerable<Task> Get()
{
// return tasks for authorized user
}
现在,我将如何只为授权用户返回任务?将用户 ID 作为查询参数传递不是一种选择 - 禁止请求其他用户的任务。
您可以从您的操作过滤器中丰富 HttpRouteData 并在控制器操作中读取它。actionContext.ControllerContext.RouteData.Values.Add("UserId", someVaue);
您还可以使用 System.Runtime.Remoting.Messaging.CallContext 类( GetData 和 SetData )
在您链接到的示例代码中,他们正在加密令牌中的用户名。在过滤器中,他们从 http 标头中获取此令牌,将其解密回用户名,并根据 AuthorizedUserRepository 查询它。
AuthorizedUserRepository.GetUsers().First(x => x.Name == RSAClass.Decrypt(token));
您当然可以使用用户 ID 而不是名称,并使用真实的存储库而不是这个示例库。您可以在控制器操作或构造函数中重新执行所有这些操作,也可以将其传递给路由数据或某些 ThreadStatic 属性。如果您想真正花哨,您可以实现基于声明的安全性并在当前线程的主体上设置声明。真的,你如何传递它并不重要。
最终,您只需在查询或 linq 语句的 where 子句中使用此值来过滤到您希望允许用户访问的数据。