C# RESTful服务和用户维护-url结构和命令问题

C# RESTful服务和用户维护-url结构和命令问题,c#,wcf,rest,restful-url,wcf-rest,C#,Wcf,Rest,Restful Url,Wcf Rest,我正在设计restful服务和一个维护用户帐户的实体。我是在.NET中使用会员资格提供者来完成的 以下是我所拥有的: /users/GET-返回用户列表 /用户/发布-可以创建或更新 多个用户(用户的post数组) (对象) 如果您正在更新或创建用户,此帖子将无关紧要 我的问题是:如何创建服务来更改密码?更改密码与更新用户过程是分开的。我的想法是: /用户/{userName}/密码发布到 更改用户密码 但我必须在这里传递不同的物体?(我使用JSON) 你对如何布局URL有什么建议吗?我真的应该

我正在设计restful服务和一个维护用户帐户的实体。我是在.NET中使用会员资格提供者来完成的

以下是我所拥有的:

/users/GET-返回用户列表

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

如果您正在更新或创建用户,此帖子将无关紧要

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

/用户/{userName}/密码发布到 更改用户密码

但我必须在这里传递不同的物体?(我使用JSON)


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

问题在于我们是否将密码视为一种资源

在我的用户dbs中,我将所有密码(盐渍和拉伸)存储在它们自己的表中,因此我可以轻松地将密码作为单独的资源呈现。但仅仅因为你没有那个细粒度的控制并不意味着你不能做同样的事情,但是我不会考虑为密码实现一个get,最终你需要一个认证服务,它应该遵循某种协议。 rest服务可以随意表示其数据,而不考虑底层结构,因此,考虑到这一点,我认为如果在您的案例中有意义,您可以将其作为单独的资源来进行


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

问题是,我们是否将密码本身视为资源

在我的用户dbs中,我将所有密码(盐渍和拉伸)存储在它们自己的表中,因此我可以轻松地将密码作为单独的资源呈现。但仅仅因为你没有那个细粒度的控制并不意味着你不能做同样的事情,但是我不会考虑为密码实现一个get,最终你需要一个认证服务,它应该遵循某种协议。 rest服务可以随意表示其数据,而不考虑底层结构,因此,考虑到这一点,我认为如果在您的案例中有意义,您可以将其作为单独的资源来进行


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

如果我理解您的问题,您希望得到有关uri布局本身的相关建议。下面的建议特别涉及到设计一个Uri,用户可以使用它来更改密码

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

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

  • 防止在更新用户详细信息时意外更改密码
  • 每当此方法更改时,您可能需要额外的安全审查,因为其中允许匿名用户更改现有用户密码的任何缺陷都将允许匿名用户劫持帐户
  • 您可能还希望包括其他附加的安全功能,如通知用户其密码已更改,并使应用程序的任何OAuth令牌失效。会员资格提供者很好,但没有提供这种额外的措施
  • 因为它是一个不同的Uri,所以您可以监视它的使用情况并将其与IP地址关联,从而检测是否有人试图破坏用户帐户 您只需将数据契约放到
    https://example.com/users/{id}/密码

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

    后者假设您将授权客户端是否可以实际执行此操作。您可能想看看是使用PUT还是POST。此外,在设计RESTfull服务(包括Uri布局)时,这本书对我来说非常宝贵

    如果我理解您的问题,您可能希望得到有关Uri布局本身的相关建议。下面的建议特别涉及到设计一个Uri,用户可以使用它来更改密码

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

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

  • 防止在更新用户详细信息时意外更改密码
  • 每当此方法更改时,您可能需要额外的安全审查,因为其中允许匿名用户更改现有用户密码的任何缺陷都将允许匿名用户劫持帐户
  • 您可能还希望包括其他附加的安全功能,如通知用户其密码已更改,并使应用程序的任何OAuth令牌失效。会员资格提供者很好,但没有提供这种额外的措施
  • 因为它是一个不同的Uri,所以您可以监视它的使用情况,并将其与IP地址关联,从而检测是否有人在使用它