ServiceStack: доступ к информации о сеансе из Javascript
Я создаю SPA, используя ServiceStack и AngularJs. Когда пользователь входит в систему, я устанавливаю некоторые переменные в методе OnAuthenticated:
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);
}
Итак, мой вопрос, как я могу получить доступ к этой информации в Javascript? Нужно ли создавать службу, которая предоставляет их или она возвращается в заголовке HTTP?
1 ответ
Нужно ли создавать службу, которая предоставляет их или она возвращается в заголовке HTTP?
Пользовательские параметры, которые вы добавляете в сеанс, по умолчанию не предоставляются ServiceStack.
Expose from Login Результат:
Вы можете вернуть эту информацию в ответе от вашего логина, как часть успешного ответа.
На данный момент ответ по умолчанию от ServiceStack's CredentialsAuthProvider
является:
return new AuthResponse {
UserName = userName,
SessionId = session.Id,
ReferrerUrl = referrerUrl
};
Вы можете настроить это в своем провайдере аутентификации, переопределив Authenticate
метод.
Большая часть кода в этом методе скопирована с оригинала CredentialsAuthProvider
метод authenticate (здесь) и затем адаптированный для использования вашего пользовательского типа сеанса (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,
...
};
}
}
Единственное реальное преимущество предоставления в виде сервиса - вы сможете вызвать его позже и получить более свежие значения данных (если они изменились) без повторной аутентификации.
Надеюсь, это поможет.