2013-05-22 6 views
7

servicestack의 세션 기능 플러그인에 대한 대안이 있습니까? 일부 시나리오에서는 쿠키를 사용하여 서비스 구현의 인증 된 세션과 일치시킬 수 없습니다. 요청의 http 헤더에있는 토큰을 사용하여 세션을 해결할 수 있습니까? 브라우저가 쿠키를 차단하고있는 경우이를 위해 선호되는 솔루션은 무엇입니까?쿠키 기반 세션/인증의 대안

답변

7

내장 된 인증 및 세션 제공자없이 ServiceStack을 사용하고 있습니다.

요청 필터로 속성을 사용하여 쿠키, 요청 헤더 또는 문자열 매개 변수에서 사용자 정보 (ID 및 토큰)를 수집합니다. 사용자가 로그인 한 후에이 정보를 제공 할 수 있습니다. 응답에 새 쿠키를 추가하고보기를 렌더링 할 때 clientside에 ID와 토큰 정보를 삽입하여 http 헤더와 링크에 대한 쿼리 매개 변수에 사용할 수 있습니다.

public class AuthenticationAttribute : Attribute, IHasRequestFilter 
{ 
    public void RequestFilter(IHttpRequest request, IHttpResponse response, object dto) 
    { 
     var userAuth = new UserAuth { }; 
     if(!string.IsNullOrWhiteSpace(request.GetCookieValue("auth")) 
     { 
      userAuth = (UserAuth)request.GetCookieValue("auth"); 

     } 
     else if (!string.IsNullOrEmpty(request.Headers.Get("auth-key")) && 
      !string.IsNullOrEmpty(request.Headers.Get("auth-id"))) 
     { 
      userAuth.Id = request.Headers.Get("id"); 
      userAuth.Token = request.Headers.Get("token"); 
     } 
     authenticationService.Authenticate(userAuth.Id, userAuth.token); 
    } 
    public IHasRequestFilter Copy() 
    { 
     return new AuthenticationAttribute(); 
    } 
    public int Priority { get { return -3; } } // negative are executed before global requests 
} 

사용자가 승인되지 않은 경우이 시점에서 리디렉션합니다.

내 프로젝트는 SPA를 지원합니다. 사용자가 xmlhttprequests를 사용하여 API를 사용하면 인증 작업이 헤더로 완료됩니다. 페이지가로드 될 때 AngularJS에 해당 정보를 삽입하고 모든 요청 (부분 뷰, API 소비 등)에서 다시 사용합니다. ServiceStack은 이러한 유형의 항목에 강력합니다. AngularJS 앱과 ServiceStack보기 엔진을 나란히 구성하고, 모든 요청의 유효성을 검증하고, 앱을 세계화하는 등의 작업을 손쉽게 수행 할 수 있습니다.

쿠키가없고 요청은 javascript에 의해 호출되지 않으므로 ID와 토큰을 쿼리 매개 변수로 전달하는 링크를 항상 생성하고 양식의 숨겨진 입력을 통해 전달하는 경우 쿠키없이 인증을 지원할 수 있습니다.

4

@Guilherme Cardoso : 현재 솔루션에서는 PreRequestFilters와 기본 제공 세션 기능을 사용하고 있습니다.

내 워크 플로우/해결 방법은 다음

사용자가 내가 쿠키를 가져다가 HTTP 헤더를 사용하여 클라이언트에 보낼 권한이됩니다

. 이제 클라이언트는 요청의 http 헤더 (Authorization)에 쿠키가 설정된 경우 서비스를 호출 할 수 있습니다.

이렇게하려면 위조 된 권한 헤더를 PreRequestFilter를 사용하여 요청의 쿠키로 리디렉션합니다. 이제 세션 기능을 사용할 수 있습니다. 해킹 같은 느낌하지만 이것에 대한 순간 ;-)

public class CookieRestoreFromAuthorizationHeaderPlugin : IPlugin 
{ 
    public void Register(IAppHost appHost) 
    { 
     appHost.PreRequestFilters.Add((req, res) => 
      { 
       var cookieValue = req.GetCookieValue("ss-id"); 

       if(!string.IsNullOrEmpty(cookieValue)) 
        return; 

       var authorizationHeader = req.Headers.Get("Authorization"); 

       if (!string.IsNullOrEmpty(authorizationHeader) && authorizationHeader.ToLower().StartsWith("basictoken ")) 
       { 
        var cookie = Encoding.UTF8.GetString(Convert.FromBase64String(authorizationHeader.Split(' ').Last())); 

        req.Cookies.Add("ss-id",new Cookie("ss-id",cookie)); 
        req.Items.Add("ss-id",cookie); 
       } 
      }); 
    } 
} 
+0

감사 작동,이, 내 인증 호출에서 반환 된 세션 ID를 취할 수 있도록 각도 아약스를 통해 내 CORS 구현의 마지막 조각 /이었다 해당 Ajax 호출에서 사용자 정의 헤더로 추가 한 다음 서비스 스택에서 표준 인증자가 쿠키를 예상 할 때 헤더를 가져올 사용자 정의 인증 제공자를 만들 필요가 없습니다. –