1

我正在设计宁静的服务和要维护的实体之一 - 用户帐户。我在 .NET 中使用会员提供程序。

这是我所拥有的:

/users/ GET - 返回用户列表

/users/ POST - 可以创建或更新多个用户(发布用户对象数组)

如果您更新或创建用户,此 POST 无关紧要

我遇到的问题:如何创建更改密码的服务?更改密码与更新用户过程是分开的。我在想类似的事情:

/users/{userName}/password POST - 更改用户密码。

但是我必须在这里传递不同的对象?(我使用 JSON)

你对如何布局 URL 有什么建议吗?我真的应该创建另一个对象吗?MembershipProvider 需要更改新旧密码

4

2 回答 2

1

那么问题必须是我们是否将密码本身视为一种资源。

在我的用户 dbs 中,我将所有密码(加盐和拉伸)存储在他们自己的表中,因此我可以轻松地将密码显示为单独的资源。但仅仅因为你没有那种细粒度的控制并不意味着你不能做同样的事情——但我不会考虑为密码实现 GET,最终你需要一个身份验证服务,这应该遵循一些一种协议。

休息服务可以根据自己的意愿自由地表示其数据,而无需真正考虑底层结构,因此,鉴于此,我认为如果在您的情况下有意义,您可以自由地将其作为单独的资源进行。

您可以在您的用户数据中包含一个用于更改密码的 uri。客户端必须知道要发送的数据类型(所以是的,您需要一个专用的资源类型来处理更改请求),并且应该使用 POST 请求触发 uri。

于 2011-06-11T01:31:28.713 回答
0

如果我理解您的问题,您希望获得与 Uri 布局本身相关的建议。下面的建议专门与设计一个可以用来更改密码的 Uri 有关。

切勿在 URI 中以明文形式包含任何敏感信息,即使它来自 HTTPS,因为该信息可能会写入服务器上的日志文件,或者更糟的是,由分析或监控软件记录。确保敏感信息作为正文的一部分或标题的一部分发送。

以下是为什么使用 RESTfull 服务更改密码可能需要其自己的 Uri 的几个注意事项:

  1. 在更新用户详细信息时防止意外更改密码。
  2. 每当此方法发生更改时,您可能需要额外的安全审查,因为其中允许匿名用户更改现有用户密码的任何缺陷都将允许该匿名用户劫持帐户。
  3. 您可能还希望包含其他额外的安全功能,例如通知用户他们的密码已更改,并使应用程序发出的任何 OAuth 令牌无效。会员提供者很棒,但没有提供这种额外的措施。
  4. 由于它是不同的 Uri,因此您可以监控其使用情况并将其与 IP 地址相关联,从而检测是否有人试图入侵用户帐户。

您可以将数据合同放入https://example.com/users/{id}/password

[DataContract]
public class ChangePassword
{
   [DataMember]
   public string OldPassword { get; set; }

   [DataMember]
   public string NewPassword { get; set; }
}

后者假定您将授权客户端是否可以实际执行此操作。您可能想查看REST 中的 PUT 与 POST是否使用 PUT 或 POST。此外,在设计 RESTfull 服务(包括 Uri 布局)时,本书RESTful Web ServicesREST API Design Rulebook对我来说非常宝贵。

于 2012-02-27T21:45:21.350 回答