0

假设我使用此处描述的自定义过滤器属性实现了基于令牌的授权。

我们还假设,我有一个返回任务的控制器:

public IEnumerable<Task> Get()
{
    // return tasks for authorized user
}

现在,我将如何只为授权用户返回任务?将用户 ID 作为查询参数传递不是一种选择 - 禁止请求其他用户的任务。

4

2 回答 2

1

您可以从您的操作过滤器中丰富 HttpRouteData 并在控制器操作中读取它。actionContext.ControllerContext.RouteData.Values.Add("UserId", someVaue);

您还可以使用 System.Runtime.Remoting.Messaging.CallContext 类( GetData 和 SetData )

于 2012-09-27T22:35:41.747 回答
1

在您链接到的示例代码中,他们正在加密令牌中的用户名。在过滤器中,他们从 http 标头中获取此令牌,将其解密回用户名,并根据 AuthorizedUserRepository 查询它。

AuthorizedUserRepository.GetUsers().First(x => x.Name == RSAClass.Decrypt(token));

您当然可以使用用户 ID 而不是名称,并使用真实的存储库而不是这个示例库。您可以在控制器操作或构造函数中重新执行所有这些操作,也可以将其传递给路由数据或某些 ThreadStatic 属性。如果您想真正花哨,您可以实现基于声明的安全性并在当前线程的主体上设置声明。真的,你如何传递它并不重要。

最终,您只需在查询或 linq 语句的 where 子句中使用此值来过滤到您希望允许用户访问的数据。

于 2012-09-28T03:48:17.113 回答