2011-06-11 46 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對我來說是非常寶貴的。