2011-03-30 68 views
4

不可能具有无状态认证。因此,在设计具有认证的RESTful软件时,为了保证安全,我们会妥协这种体系结构?这可以走多远?只要建立更安全的系统,你能存储任何数量的状态吗?作为状态形式的RESTful认证

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

” ......在静止状态下的客户端能够 与其用户进行交互,但是不能创建 负荷和在服务器或 网络上不消费每个客户端的 存储。“

然而,一个用户名和密码是通过定义一个状态是唯一的客户端,并随时可能更改。此外,客户可以对状态进行身份验证,否则它们将具有有限访问权或无权访问权限。

+0

身份验证不处理,请重新读取rfcs – 2011-03-30 21:37:12

+0

另外“但是,用户名和密码的定义是客户端唯一的状态”这是无意义的。所考虑的状态处于应用程序级别。 http是无状态的,它仍然可以进行身份​​验证。 – 2011-03-30 21:43:25

+2

@Captain长颈鹿如果服务器不存储每个用户的用户名和密码,如何使用用户名和密码登录。这违反了''不会消耗服务器上的每个客户端存储'''。另外RESTful架构没有RFC,它不是协议。 – rook 2011-03-30 21:44:02

回答

8

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

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

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

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

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

0

简而言之:REST的无国籍指出,在于国家与客户;)

简单地说,无国籍在意味着每个请求的客户端提交应包含服务器处理请求的所有信息。因此,不需要服务器上的先前状态。

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

+0

这将是一个很大的禁忌。 “会话状态可以被保存在服务器上的资源中捕获。” – 2011-03-30 21:51:06

+0

真的吗?你能告诉我们为什么? – 2011-03-30 21:53:31

+0

不知道如何,我认为这句话在考虑无国籍时几乎可以说明问题。 – 2011-03-30 21:55:25

1

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

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

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

+0

我仍然认为这是一种状态。 – rook 2011-03-30 23:41:49

+0

它没有比由HTTPD创建的套接字和其他资源更好地服务请求。 – 2011-03-30 23:44:58

+0

这个认证凭证与用户名和密码一样多用户状态。 – rook 2011-03-30 23:47:08

1

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

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

从客户端到服务器的每个请求都必须包含所有必要的信息,以了解该请求,服务器

上不能采取任何存储方面的优势,并且在事实上是达到此目的的一种方式拥有一个返回令牌的身份验证端点。但不是在该令牌中存储随机标识符,而是存储所标识实体的主键,然后存储该密钥的加密哈希,并用客户端未知的秘密密钥进行腌制。

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

+0

用来构造这个令牌的秘密可以被强制脱机,它听起来像一个hmac。 – rook 2014-09-30 03:26:02

+0

你可以尝试离线强制它,但只要密码是健全的,你可能会得到任何地方是值得怀疑的。 – 2014-10-01 02:09:45