我覺得/api/controller/docId
可能是最好的辦法還是使用單一的代理鍵來代表客戶端Id和的docId(我的偏好)。
除非您需要允許客戶端查看其他客戶端資源,否則我會將其從URI方案中隱藏起來,在最壞的情況下,它可能被認爲是信息泄漏,因爲您已驗證客戶端並知道他們是誰。這也是一個開銷,即你仍然必須檢查在URL中的客戶端ID映射到請求的用戶名和密碼,所以你需要反正檢索每個請求的客戶端ID。
如果你看如何等多租戶環境中工作,例如銷售隊伍的你可以看到他們必須通過安全機制來推斷客戶,或者有幸爲每個對象/資源擁有一個唯一的ID。
我見過的一種方法是在URL的根把客戶標識符(通常somekind的的代理鍵,避免讓其他用戶數據庫的ID!)如/ API/{的clientId} /控制器/的docId。在多租戶環境中,每個資源可能/根據定義,該客戶端是唯一的。
有時這種方法給的理由是,有每個客戶助攻唯一的URL與緩存.../API/{}的clientId /控制器/的docId或/ API /控制器/ {}的clientId /的docId
關於基本身份驗證的簡要說明
您的方法沒有任何問題,但請考慮......您可以在驗證密碼和用戶名時檢索客戶端ID,並將其添加爲原則上的聲明。至少可以在代碼中使用,而無需進一步查找數據庫(在請求的生命週期內)。
更進一步...考慮一個兩步認證機制,其中令牌作爲聲明在令牌中發放(遵循正確的用戶名和密碼),而客戶端ID實際上在令牌中。這樣,使用令牌的後續請求意味着您將不需要爲每個請求回撥數據庫來驗證和檢索信息。看看OAuth承載令牌http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html(一定要簽名)或其他一些方法...
我也有類似的情況。您是否考慮將租戶ID存儲爲用戶聲明(或訪問令牌/憑證上的類似內容)?我認爲將租戶作爲URI的一部分是理想的,但在應用於現有軟件時需要更多的工作。 – bjornhol
@bjornhol如果租戶ID不包含在URL中,那麼它會使本地緩存變得困難,因爲我使用整數而不是標識符的guid,因此租戶之間可能會發生衝突。 –