RESTful服务和用户维护 - 网址结构和命令问题

时间:2011-06-11 01:13:49

标签: c# wcf rest restful-url wcf-rest

我正在设计restful服务和其中一个要维护的实体 - 用户帐户。我在.NET中使用成员资格提供程序。

这就是我所拥有的:

  

/ users / GET - 返回用户列表

     

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

如果您更新或创建用户

,此POST无关紧要

问题我:如何创建服务来更改密码?更改密码与更新用户过程是分开的。我想的是:

  

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

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

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

2 个答案:

答案 0 :(得分:1)

那么问题就在于我们是否将密码视为资源本身,或者不是。

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

休息服务可以自由地表示其数据,但是没有真正考虑底层结构,因此,我认为如果在您的情况下有意义,您可以自由地将其作为单独的资源来实现。

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

答案 1 :(得分:0)

如果我理解你的问题,你会想知道如何与Uri布局本身相关。以下建议与设计可以用来更改密码的Uri有关。

永远不要在清除URI中包含任何敏感信息,即使它是通过HTTPS提供的,因为该信息可能会写入服务器上的日志文件,或者更糟糕的是,由分析或监控软件记录。确保将敏感信息作为正文的一部分或标题的一部分发送。

以下几点需要考虑为什么使用RESTfull服务更改密码可能需要自己的Uri:

  1. 更新用户详细信息时防止意外更改密码。
  2. 每当此方法发生更改时,您可能需要额外的安全审核,因为其中允许匿名用户更改现有用户密码的任何缺陷都将允许该匿名用户劫持该帐户。
  3. 您可能还希望包含其他其他安全功能,例如通知用户其密码已更改,并使应用程序的任何OAuth令牌问题无效。会员提供商很棒,但没有提供这些额外的措施。
  4. 由于它是一个不同的Uri,您可以监控其使用情况并将其与IP地址相关联,从而可以检测是否有人试图破坏用户帐户。
  5. 您可以将数据合同提交到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。此外,在设计RESTfull服务(包括Uri布局)时,本书RESTful Web ServicesREST API Design Rulebook对我来说非常宝贵。