4

创建一个尝试使用 RESTful API 的 angularjs 单页应用程序,我遇到了一个我似乎无法找到答案的问题。我试图阻止会话希望,一位登录的用户查看请求发现他的帐户 ID 是 13。所以他执行了相同的请求,但这次更改了获取帐户 ID 14 信息的请求。

因此,在用户登录后,我将会话变量设置为他的帐户 ID,并将从 ajax 请求中删除帐户 ID。然后我尝试从继承自 ApiController 的类访问 Session。环顾四周后,我意识到存储会话信息不是很 RESTful。

那么,我将如何确保一个帐户无法访问另一个帐户的信息,因为他们观察了 ajax 请求并弄清楚了如何操纵 ajax 请求?

restful 不是要和需要认证和授权的用户一起使用吗?我在考虑可能散列 ID 或其他东西,但我不确定这是正确的方法。

更新:

我现在有基于令牌的身份验证工作。但是对于如何防止某人摆弄 HTTP 请求并获取不属于他的信息,我仍然一无所知。例如,我想检索 ID 为 14 的帐户的所有用户。

HTTP Get /users/14

我有一个令牌,所以我知道尝试使用 Web API 的人在某些时候进行了身份验证。我可以将其锁定为角色。但是没有什么可以阻止这个经过身份验证的人对请求进行摆弄/黑客攻击并执行以下操作

HTTP Get /users/58

现在此人已获得 ID 58 信息的所有帐户。这是不属于14号账户的信息,但现在他可以浏览其他人的信息。

我需要有人知道来自浏览器的请求并说它是针对 ID 14 的帐户,它确实是帐户 14。我可以将该信息放入令牌中,但如何在处理程序中检查或检查它api控制器?

4

3 回答 3

3

您所描述的问题并不是基于 REST 的服务所独有的。事实上,这是十大 OWASP 漏洞(不安全的直接对象引用)之一。您将需要首先识别用户,然后对用户进行身份验证。为了识别,使用了 ID,例如用户 ID。标识符可以是任何你想要的。识别后,您需要对用户进行身份验证。这是通过验证提供给应用程序的凭据来完成的,例如密码。标识符和凭证可以是任何东西,比如旧的用户名/密码,或者可以是令牌或 API 密钥。它实际上与手头的问题无关。一旦通过身份验证,您就可以根据用户在您的应用中可以执行的操作来授权请求​​。无论您是否使用令牌、证书或其他什么,authz 部分都是必须的。

假设您正在使用消息处理程序来验证用户提交的凭据。身份验证完成后,您可以将与经过身份验证的用户关联的帐号存储在 的属性集合中HttpRequestMessage。这是在服务器端完成的,没有用户可以让系统存储一些随机的帐号。只有与经过身份验证的用户关联的帐号存储在属性集合中。有了它,您现在可以授权请求。比如说,您可以编写一个授权过滤器来提取此帐号并将其与 URI 中的帐号进行比较,以确定该请求是否被允许。通过针对 GET 操作方法应用此过滤器,您可以确保只有正确的人才能看到正确的数据。

例如,用户 ID 为“abc”且密码为“pwd1”的用户向 /users/14 发出 GET 请求。第一步是,您将验证用户 ID。如果您的商店中有 ID 为“abc”和密码为“pwd1”的用户,您将认为该用户是真实的。作为此身份验证的一部分,您可以提取与用户“abc”关联的帐号。假设它是 15。您将在 request.properties 中存储 15。从您的授权过滤器中,您可以从 URI 中获取帐号,即 14,并将其与请求中的帐号(即 15)进行比较。显然,数字不匹配,您在OnActionExecuting过滤器的方法中使用 a拒绝请求401。

我上面描述的是一种简单的方法。更好的方法(就可扩展性而言)是使用声明,但这里无法解释所有这些。您可以从 Dominick 的博客中获得大量与基于声明的身份相关的信息。

于 2013-09-24T17:43:30.760 回答
2

每个请求都应该经过身份验证。如果提供的凭据不允许具有帐户 13 的用户访问来自帐户 14 的数据,则该请求将被拒绝。诀窍是找到一种快速执行 authZ 的方法。

于 2013-09-03T00:15:10.933 回答
1

您似乎缺少有关如何实施身份验证的信息。正如您正确指出的那样,使用会话来保存身份验证信息并不是很安静。这里是替代品

  1. 实施您自己的 OAuth 提供程序或使用第三方(例如 Azure ACS)
  2. 实施 STS 提供程序(但这仅适用于肥皂)
  3. 如果您不想处理上述两个,请实施自定义令牌系统。基本系统将获取用户 ID,对其进行加盐并用私钥加密 - 但不要引用我的话说这有多安全......

在所有情况下,身份验证信息都存储在 cookie 中,类似于会话 cookie。但它仍然是无国籍的。

Web 上的标准方式似乎是 oauth 方式,实际上标准的 VS MVC 模板甚至带有开箱即用的 OAuth 消费者。所以问题是,如何将 oauth 令牌链接到您的内部用户 ID。这真的很简单,因为您在新用户通过身份验证后实施“注册”步骤 - 您将用户 ID 和 oauth 令牌保留在数据库表中,以链接两者。

该链接可以快速检索,并且可以缓存以提高速度。我听说有些人为一些非常大的系统(谷歌文档)实现了这种类型的凭据缓存。

于 2013-10-01T03:21:53.530 回答