2014-05-14 4 views
2

ServiceStack 및 AngularJs를 사용하여 SPA를 만들고 있습니다.ServiceStack : Javascript의 세션 정보에 액세스

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
    { 
     var sessionUser = session.TranslateTo<AppUserSession>(); 
     var user = _userRepo.LoadUser(session.UserAuthName); 

     var userSettings = ConfigurationSettings.Load(user); 

     var customers = _customerRepo.ToList(); 
     sessionUser.UserName = user.UserName; 
     sessionUser.DisplayName = user.DisplayName; 
     sessionUser.CustomerCount = customers.Count; 
     sessionUser.CustomerRecordId = customers.First().RecordID; 
     sessionUser.RefreshRate = userSettings.RefreshRate; 

     authService.SaveSession(sessionUser, SessionExpiry); 
    } 

그래서 제 질문은, 어떻게 다음 자바 스크립트에서이 정보에 액세스 할 수있다 : I의 사용자 로그는 OnAuthenticated 방법 몇 가지 변수를 설정하면? 노출 시키거나 HTTP 헤더로 반환하는 서비스를 만들어야합니까?

답변

3

노출 시키거나 HTTP 헤더로 반환하는 서비스를 만들어야합니까?

세션에 추가하는 사용자 지정 매개 변수는 기본적으로 ServiceStack에 노출되지 않습니다.

로그인 결과에서 노출 :

당신은 성공적인 응답의 일환으로 로그인로부터의 응답이 정보를 반환 할 수 있습니다. 순간

ServiceStack의 CredentialsAuthProvider에서 기본 응답은 다음과 같습니다

return new AuthResponse { 
    UserName = userName, 
    SessionId = session.Id, 
    ReferrerUrl = referrerUrl 
}; 

당신은 Authenticate 방법을 재정 의하여 사용자 지정 인증 공급자에서이 사용자 정의 할 수 있습니다.

이 메서드의 대부분의 코드는 original CredentialsAuthProvider authenticate method (here)에서 복사 된 다음 사용자 지정 세션 유형 (AppUserSession)을 사용하고 사용자 지정 응답을 채우도록 적용됩니다.

public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
{ 
    var userName = request.UserName; 
    var password = request.Password; 

    if (!LoginMatchesSession(session, userName)) 
    { 
     authService.RemoveSession(); 
     session = authService.GetSession(); 
    } 

    if (TryAuthenticate(authService, userName, password)) 
    { 
     session.IsAuthenticated = true; 

     if (session.UserAuthName == null) 
     { 
      session.UserAuthName = userName; 
     } 

     OnAuthenticated(authService, session, null, null); 

     var sessionUser = authService.GetSession() as AppUserSession; 

     // Return your Authentication Response DTO here 
     return new { 
      UserName = userName, 
      SessionId = session.Id, 
      DisplayName = sessionUser.DisplayName, 
      CustomerCount = sessionUser.CustomerCount, 
      ... 
     }; 
    } 

    throw HttpError.Unauthorized("Invalid UserName or Password"); 
} 

는 서비스를 이용하여 노출 :

당신이 추가 정보를 반환 사용자 정의 서비스를 작성하여 그들에게 노출 될 수 있습니다,하지만 그 후 성공적으로 로그인 한 후 다른 요청을 필요로하며, 이는 더 많은 지연을 추가 할 수 사용자 및 데이터 오버 헤드.

[Route("/SessionInfo", "GET")] 
public class GetSessionInfoRequest : IReturn<SessionInfo> 

public class SessionInfo 
{ 
    public string Username { get; set; } 
    public string DisplayName { get; set; } 
    public int CustomerCount { get; set; } 
    ... 
} 

[Authenticate] 
public class SessionInfoService : Service 
{ 
    public SessionInfo Get(GetSessionInfoRequest request) 
    { 
     var sessionUser = SessionAs<AppUserSession>(); 
     return new SessionInfo { 
      UserName = sessionUser.UserName, 
      DisplayName = sessionUser.DisplayName, 
      CustomerCount = sessionUser.CustomerCount, 
      ... 
     }; 
    } 
} 

서비스로 노출의 유일한 장점은, 나중에 전화를하고 다시 인증 할 필요없이 데이터 (이 변경된 경우)의 신선한 값을 얻을 수있을 것입니다.

희망이 있습니다.

+0

안녕하세요 @ 스캇 내가'Authenticate' 메서드에서'sessionUser' 개체에 액세스 할 때 값이 설정되지 않은 빈 개체입니까? – CallumVass

+0

@BiffBaffBoff'OnAuthenticated' 호출 다음에'var sessionUser = session as AppUserSession; '을 이동 시켰습니까? 몇 분 전에 코드를 변경 했나요? – Scott

+0

그래, 나는 그것을 옮겼지만 여전히 비어 있었고 새로운 질문을 시작하길 원했던가? – CallumVass

관련 문제