2014-09-27 2 views
3

Owin Oauth2를 사용하여 단일 페이지 응용 프로그램 (AngularJS + .Net MVC Json Rest API)의 인증 흐름을 개발 중입니다. 같은).RefreshToken을 취소하고 Oauth2에서 AccessToken을 동시에 무효화하는 방법

무명 상태를 유지하고 토큰이 쿠키보다 문제가 적은 모바일 앱에서 동일한 Api를 사용하기 때문에 전통적인 쿠키 + 세션보다 베어러 토큰 경로를 선택했습니다.

이 단순화 흐름이다

  • 사용자합니다 ( TokenProvider 라우팅 HTTPS를 POST)를 서버에게 사용자 이름/패스워드를 제출
  • Owin 작성하는 발생 된 GUID를 포함하는 제와 AccessToken (그것은 세션 ID와 같은 것을 의미 할 것입니다.) 그리고 다른 몇몇 요구들.
  • Owin은 RefreshToken을 만듭니다. RefreshToken | | 티켓 | DateIssued | DateExpire | DateEnd

    • 서버 모두를 제공

    GUID (PK)이 :

  • 서버에는 다음 필드로 RefreshToken 테이블에 항목을 만듭니다 AccessTokenRefreshToken을 클라이언트에 전송합니다.

  • 클라이언트는 AccessTokenRefreshToken을 모두 SessionStorage에 저장합니다.

  • 클라이언트는 AccessToken으로 Api에 액세스합니다.

AngularJS와는 AccessToken 만료에 가까운 것을 감지, 모든 요청과 발행 grant_type refresh_token request 버퍼;
서버 RefreshToken 클라이언트 제공하고 사용

  • 검사를 새로 고침 토큰 여전히 DB에서 유효한 경우 (DateExpire > GetTime() And DateEnd is Null)는
  • 티켓에서 AccessToken를 생성 DB로부터 티켓을 취하고
  • db 날짜를 새로운 날짜, 새로운 RefreshToken 및 새 티켓으로 업데이트합니다 (참고 : GUID는 동일하게 유지됩니다).

클라이언트가 로그 아웃 서버 측에 도달하면 기록 된 사용자의 ID 클레임에서 읽은 GUID가 테이블의 항목을 무효화하는 데 사용됩니다 (DateEnd = GetTime()).
클라이언트 쪽 두 토큰은 SessionStorage에서 제거됩니다.

이렇게하면 RefreshToken을 취소하여 다른 요청을 거부하여 AccessToken을 새로 가져올 수 있습니다.

이 접근법의 문제점은 권한 부여가 철회되는 시간대 (예 : RefreshToken가 DB에서 무효화 됨)이지만 AccessToken은 유효합니다 (제한된 시간대 임에도 불구하고).

각 요청에 대해 AccessToken의 유효성을 검사하고 사용자 ID 클레임에서 GUID를 가져 와서 특정 GUID의 새로 고침 토큰이 유효한지 확인하기 위해 db를 확인하는 것이 좋습니다.

O (1)을 수행하는 쿼리를 만드는 것이 매우 간단하지만 단일 실패 지점 자체가 시스템의 확장 성과 성능에 부정적인 영향을 미칠 수 있습니다.

이 문제를 완화하는 또 다른 방법을 알고 계시 며 접근 방법에 결함이 있습니까?

+0

모바일 장치에 대한 전자 메일 액세스를 차단할 때 Office 365 Exchange에서이 문제가 발생했습니다. 사용자의 전자 메일 계정은 액세스 토큰이 만료 될 때까지 잠기지 않습니다.이 경우 정확하게 1 시간이었습니다. – peterincumbria

답변

8

접근 방법에 문제가 없으며 이전에 blogged 접근 방식과 매우 동일하지만 액세스 토큰을 보낼 때 DB 검사를 수행하지 않는 것이 좋습니다.

짧은 액세스 토큰 (30 분)을 발행하지 않는 이유와 새로 고침 토큰을 취소 한 후 액세스 토큰 수명이 만료 될 때까지 기다리는 이유는 무엇입니까? 그리고 클라이언트에서 클라이언트 로컬 저장소에서 새로 고침 토큰과 액세스 토큰을 지울 수 있습니다.

+1

저는 누군가가 로그 아웃 할 때 어떤 자격 증명이 여전히 리소스 서버에 액세스하는 것이 좋다고 생각하지 않습니다. Owin과 Oauth 2에 관한 귀하의 블로그에 환상적인 내용을 담아 많은 사람들을 돕고 있습니다. 나는 블로그 게시 시간 수백을 읽었습니다 :). – systempuntoout

+0

도움이 되었다니 다행이다. 나는 그것을 완전하게 폐지하는 것이 더 낫다.하지만이 방법은 무기 토큰이 어떻게 작동하는지에 동의한다. ( –

+0

@ TaiseerJoudeh : 은행 용 My Requirement : 1) 한 사용자에 대해 하나의 인스턴스가있다 .2) 로그 아웃은 즉시 실행되고 일단 로그 아웃되면 토큰이 무효화됩니다. Identity가 은행 프로젝트에 좋은가요? 그렇지 않다면이 문제에 대한 다른 해결책은 무엇입니까? 은행 업무 프로젝트가 다른 응용 프로그램보다 가장 안전해야하기 때문에 !!! –

관련 문제