0

我有一个编写为 ASP MVC 应用程序的 Web 服务,它基本上使用滚动 cookie 作为其身份验证机制。所以有人通过 https 将他们的用户名和密码发送到服务,然后验证他们并向他们发出一个包含令牌、用户标识符和时间戳的 cookie,如 HTTPONLY 和 SECURE。然后,每当用户需要访问需要身份验证的页面时,cookie 就会被发送过来,并使用时间戳和针对用户的令牌进行验证,假设通过了它,然后发出一个新的时间戳并将其发送回用户。

这种方法迄今为止有效,尽管仍然存在 CSRF(通过滚动时间戳减少)和其他一些漏洞的可能性,但这是当前项目团队愿意承受的风险,但仍有一大笔技术债务需要调查更好的方法,但那是另一个讨论,因为我们的主要目标是无状态服务,因此它可以轻松扩展。

无论如何,一方面,现在的问题是我们被要求从服务中向其他 3rd 方公开数据。然而,他们不会像使用浏览器的普通用户那样使用这些数据,而是作为任何平台上的某种应用程序。所以现在我想知道是否有更好的方法让基于应用程序的消费者对自己进行身份验证,因为目前他们需要发送一个 http 请求进行身份验证,然后获取返回的 cookie,并将其发送给受限请求。然而,其他第 3 方需要在他们想要从我们的系统获取数据时不断处理这个 cookie,这对他们来说似乎有点痛苦。

那么有没有另一种我看不到的方法来做到这一点?因为我可以看到保持它无状态的两种方法是每次在查询字符串上发送一些令牌,这再次要求他们进行身份验证和存储它,并且会使查询字符串不那么干净。然后另一种方式是我们目前使用 cookie 作为状态机制。

4

1 回答 1

3

如果您真的关心保持 API RESTful,那么在查询字符串上发送凭据绝对是一个禁忌,因为在 REST 中,整个 URI 是资源的不透明标识符,并且使用 cookie 是服务和 HTTP 之间不必要的耦合. 验证的正确方法是协议允许和标准化的任何方法,因此,在您的情况下,通过 WWW-Authenticate 和 Authorization 标头。客户端应该在每个请求的 Authorization: Basic 标头中发送他们的用户名和密码(当然,总是使用 SSL)。

如果您真的想在客户端使用用户名:密码进行身份验证后使用令牌,您还可以在同一标头中将其作为自定义授权方案接受。例如,类似:

Authorization: MyCompany apitoken="12k9023nd02890382n8902"

每当您对什么是 RESTful 方式做某事有疑问时,只要想想您正在使用的协议的标准是什么。这是 REST 背后的限制之一。每当您必须记录要替换标准化功能的内容时,您就做错了。如果标准不足以满足您的需求,则可以添加一些内容,例如此处带有令牌的自定义身份验证方案。

于 2013-11-02T23:43:48.833 回答