2011-06-11 58 views
1

我正在设计宁静的服务和维护的实体之一 - 用户帐户。我在.NET中使用它并使用成员资格提供程序。RESTful服务和用户维护 - 网址结构和命令问题

以下是我有:

/用户/ GET - 用户的回报清单

/用户/ POST - 可以创建或更新 多个用户(后阵列用户 对象)

如果你在升级或创建用户

问题我已经

这POST并不重要:我如何创建服务来更改密码?更改密码与更新用户过程是分开的。我在想:

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

但我要在这里传递不同的对象? (我用JSON)

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

回答

1

那么这个问题必须是我们是否看到在自己的权利的密码作为一种资源,还是不行。

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

其余服务可以自由地表示其数据,但是它的意愿不在于它的底层结构,因此,我认为如果您的情况有意义,您可以自由地将其作为单独的资源来执行。

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

0

如果我理解你的问题,你想如何与开放的布局本身的建议。下面的建议与设计Uri有关,特别是有人可以用来更改密码。

决不包括在URI中明确的任何敏感信息,即使过来HTTPS,因为这些信息可以被写入日志服务器上的文件,或者更糟的是,通过分析或监控软件记录。确保敏感信息作为身体的一部分或头部的一部分发送。

这里有几个方面的考虑,为什么有问题的REST服务可以要求自己的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; } 
} 

后者假定你授权的客户端是否可以真正执行此操作。您可能需要查看PUT vs POST in REST是否使用PUT或POST。另外,在设计包括Uri布局在内的RESTfull服务时,书RESTful Web ServicesREST API Design Rulebook对我来说是非常宝贵的。