如何使用ASP.Net Web API防止会话跳变



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

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

那么,我该如何确保一个帐户不能仅仅因为查看了ajax请求并找到了如何处理ajax请求而访问另一个帐户的信息呢?

restful不是用来与需要验证和授权的用户一起使用的吗?我想也许是散列ID之类的,但我不确定这是正确的方法。

更新:

我现在有了基于令牌的身份验证。但我仍然不知道如何防止有人篡改HTTP请求并获得不属于他的信息。例如,我想检索ID为14的帐户的所有用户。

HTTP Get /users/14

我有一个令牌,所以我知道试图使用web API的人在某个时候验证了自己。我可以把它锁定在角色上。但是,没有什么可以阻止这个经过身份验证的人篡改/破解请求并进行以下

HTTP Get /users/58

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

我需要有人知道来自浏览器的请求,并说它是针对ID为14的帐户的,它实际上是帐户14。我可以把这些信息放在令牌中,但我如何在处理程序中检查它或在ApiController中检查它?

您所描述的问题并不是基于REST的服务独有的。事实上,这是OWASP的10大漏洞之一(不安全的直接对象引用)。您需要首先识别用户,然后对用户进行身份验证。对于标识,使用ID,例如用户ID。标识符可以是任何您想要的。识别后,您需要对用户进行身份验证。这是通过验证提供给应用程序的凭据(如密码)来完成的。标识符和凭证可以是任何东西,比如好的旧用户名/密码,也可以是令牌或API密钥。事实上,这与手头的问题无关。经过身份验证后,您将根据用户在应用程序中可以执行的操作来授权请求。authz部分是必须的,无论您是否使用令牌、证书。散列用户ID或使用某种方法隐藏内容是模糊的安全性,不是一种好的做法。

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

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

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

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

您似乎缺少有关如何实现身份验证的信息。正如您正确指出的,使用会话来保存身份验证信息并不是很安全。以下是的替代方案

  1. 实现您自己的OAuth提供程序或使用第三方(例如Azure ACS)
  2. 实现STS提供程序(不过这仅适用于soap)
  3. 如果您不想处理以上两个。基本系统会获取用户id,对其进行加盐处理,并用私钥加密——但不要引用我的话来说明这会有多安全

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

web上的标准方式似乎是oauth方式,事实上,标准的VSMVC模板甚至附带了开箱即用的oauth消费者。因此,问题是,如何将oauth令牌链接到您的内部用户ID。这真的很简单,因为您在新用户经过身份验证后实现了"注册"步骤——您将用户ID和oauth标记保存在数据库表中,以将两者链接起来。

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

最新更新