RESTful身份验证作为一种状态

时间:2011-03-30 21:30:36

标签: security authentication rest

不可能在没有状态的情况下进行身份验证。因此,在使用身份验证设计RESTful软件时,为了安全起见,我们是否会妥协这种架构?这可以走多远?只要它能够构建一个更安全的系统,你能存储任何数量的状态吗?

Representation State Transfer or REST有许多核心设计概念。其中最重要的一点是REST必须无状态或引用Wikipeida:

  

“......处于休息状态的客户能够   与其用户交互,但不创建   加载和不消耗每个客户端   存储在服务器上或在   网络“。

但是,根据定义,用户名和密码是客户端独有的 state ,可能会发生变化。此外,客户端可以对状态进行身份验证,否则他们将有限制或无权访问。

4 个答案:

答案 0 :(得分:8)

RESTful系统有两种类型的状态。客户端应用程序状态和资源状态资源状态的重要一点是它应该有一个标识符,比如URL。

通过URL访问资源状态应该返回相同的信息,无论是谁访问它(假设有足够的授权)。

服务器会话状态会混乱,因为人们使用它会根据请求资源的人来改变响应的内容。这使得书签更加棘手,分享网址更加困难,缓存更加困难。

不幸的是,维基百科的报价过于宽泛,容易被误解。对我来说,最简单的思考方式是服务器应该不了解客户端的当前状态。

对客户端进行身份验证不需要您在对客户端进行身份验证后保留有关该客户端的信息。所需要的只是在下一个请求中,您再次进行身份验证。

答案 1 :(得分:1)

SSL证书不会被视为状态,它们可用于身份验证以及传输安全性。

它们对于典型的面向用户的网站不实用,但它们广泛用于Web服务,包括REST服务,其中“用户”是可以加载X509证书并将其作为一部分包含在内的代码。每个请求的凭据。

See this article表示使用WCF的C#中的示例。

答案 2 :(得分:1)

老问题,但我认为REST实际上要求服务器必须是无状态的,因为没有关于会话的数据存储在服务器上。

http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

  

从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文

实际上有一种方法可以实现这一目标。拥有一个返回令牌的身份验证端点。但是,不是在该令牌中存储随机标识符,而是存储所标识实体的主键,然后是密钥的加密散列,并使用客户端不知道的密钥进行加密。

现在,服务器可以在每次请求时高效安全地对您进行身份验证。服务器端没有会话状态 - 请求包含所需的所有信息。

答案 3 :(得分:0)

简而言之:REST的无状态声明状态由客户端决定;)

简而言之,无状态意味着客户端提交的每个请求都应包含服务器处理请求的所有信息。因此,无需服务器上的先前状态。

会话状态保留在客户端上。在REST中进行身份验证时使用的“hack”是可以捕获会话相关信息(状态)作为可以映射回客户端会话的资源。例如,开始时间,证书,具有相关信息的会话ID等。