2017-02-16 94 views
0

我在基於web api的項目中使用基於OAuth令牌的身份驗證。如何解決這個安全漏洞在web api

如果用戶通過身份驗證,則會生成訪問令牌,如下所示。

{"access_token":"FFz_DC6zzEDD4mGOCk9172ijj3sGxCUWnk-tGanm9wGk76hMB8sHI8ImeWtdUKHHGNXv465ZSlbb-3fr_hr9DqUHc9Dm9OBI7XjJhdjdOpAGAGSFOpE0Y17LCEWTjCmEZotuf42Mpgl81ewoS7OlnH4b5w4PrtzJbIBpSAMoWObziL_U3mTkeFKvWrcWOfvlSCvhhBA9Dc3UTXv3HiHKWQk0T3-pvVy7ZuW2oac-IIuaq_GYaVkIZh7s9-YjX9KAL2Z9yfrPrVOQXZe_5OcNd7nS3tdT5odchEAiuWRYQ6t7Tfb2si4T6VdAe73OYefE0se1FeQsxbOiNaLyF8OwBqymEUzEG8tEHJ-cejVbhPw","token_type":"bearer","expires_in":1799,"as:client_id":"","user":"1","role":"1",".issued":"Thu, 16 Feb 2017 09:37:44 GMT",".expires":"Thu, 16 Feb 2017 10:07:44 GMT"} 

下面是api方法之一。

[Authorize] 
    [HttpGet] 
    [Route("{userId}/{type}/")] 
    public IHttpResponse GetCustomerDetails(int userId, string type) 
    { 
     //my api stuff 
    } 

我正在使用Postman進行測試api。當我通過參數

http://localhost:50684/api/customer/1/gold 
--along the access token in token in header-- 

它返回所需的json。

但是,如果我使用相同的標記&傳遞客戶id = 2,它仍然允許訪問其他客戶(id = 2)。

http://localhost:50684/api/customer/2/gold 
--Access token in header-- 

由於生成的訪問令牌對id = 1的用戶有效,因此它不應該允許訪問id = 2的用戶的資源。

如何防止此安全漏洞?

任何幫助/建議高度讚賞。
謝謝

+0

它是因爲你沒有把你的'Tokens'保存在一個數據庫中,並把它分配給每個用戶。您必須將該令牌與唯一生成併發送到數據庫以進行安全維護的令牌進行比較。 – Valkyrie

回答

0

的問題是,您發送的用戶ID作爲一個參數,它本身是壞的設計。

簡單的解決方案是從上下文中獲取當前用戶,而不是

[Authorize] 
[HttpGet] 
[Route("{type}/")] 
public IHttpResponse GetCustomerDetails(string type) 
{ 
    var user = RequestContext.Principal.Identity.Name; 
    //my api stuff 
} 
+1

哇!這是我一直在尋找的東西。一個biggggggggggg謝謝 –

0

您可以將用戶標識和令牌存儲在某個存儲(會話,數據庫)中。 並編寫自己的MVC authorization fileter,如Authorize過濾器,它將令牌與存儲在存儲器中的用戶標識進行比較。

0

當前WebApi與用戶標識和經過驗證的用戶標識的概念不匹配。它不應該,因爲你指定的唯一東西是控制器方法的一些參數路由。您只需要使用「授權」屬性對用戶進行身份驗證,但一旦授予訪問權限,就不會再運行進一步的驗證。爲了讓這個方法只對用戶的特定子集可用,你可以編寫自己的通用驗證(即在這種情況下,檢查用戶可以通過控制器範圍內的「User」屬性訪問的聲明,或者使用一些out-的現成的處理驗證外部實現。