【问题标题】: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 子句中使用此值,即可过滤到您希望允许用户访问的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-21
        • 2014-04-03
        • 2020-04-11
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 2016-04-07
        相关资源
        最近更新 更多