2017-02-16 6 views
0

웹 API 기반 프로젝트에서 OAuth 토큰 기반 인증을 사용하고 있습니다.웹 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 
    } 

나는 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

왜냐하면 당신은'토큰 '을 데이터베이스 안에두고 각 사용자에게 그것을 할당하지 않기 때문입니다. u는 토큰을 생성 된 것으로 만 비교하고 안전한 유지를 위해 데이터베이스에 보내야합니다. – Valkyrie

답변

0

문제는 당신이 나쁜 디자인 자체 매개 변수로 사용자 ID를 보낼 것입니다.

간단한 해결책은 대신 맥락에서 현재 사용자를 얻을 수 있습니다

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

와우 !! 이것이 제가 찾고 있었던 것들입니다. biggggggggggg 덕분에 –

0

사용자 ID와 토큰을 일부 저장소 (세션, db)에 저장할 수 있습니다. 그리고 Authorize 필터와 같은 자신의 MVC authorization fileter을 작성하십시오.이 필터는 저장소에 저장된 사용자 ID와 토큰을 비교합니다.

0

현재 WebApi는 사용자 ID 및 인증 된 사용자의 ID와 일치하지 않습니다. 그리고 그것은 여러분이 지정하는 유일한 것은 어떤 매개 변수를 가진 컨트롤러의 메소드의 경로이기 때문에 안됩니다. "Authorize"속성을 사용하여 사용자 만 인증 할 것을 요구하지만 일단 액세스가 허용되면 더 이상의 유효성 검증이 실행되지 않습니다. 이 방법을 사용자의 특정 하위 집합에서만 사용할 수있게하려면 사용자 고유의 일반 유효성 검사 (예 :이 경우 컨트롤러 범위 내의 "사용자"속성을 통해 액세스 할 수있는 사용자 클레임을 확인)를 작성하거나, 인증을 처리하는 외부 구현-의 상자.