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