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,
            ...
        };
    }
}

Единственное реальное преимущество предоставления в виде сервиса - вы сможете вызвать его позже и получить более свежие значения данных (если они изменились) без повторной аутентификации.

Надеюсь, это поможет.

Другие вопросы по тегам