【问题标题】:ServiceStack: Access Session info from JavascriptServiceStack:从 Javascript 访问会话信息
【发布时间】:2014-05-14 10:17:59
【问题描述】:

我正在使用 ServiceStack 和 AngularJs 创建一个 SPA。当用户登录时,我在 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 标头中返回?

【问题讨论】:

    标签: servicestack servicestack-bsd


    【解决方案1】:

    我需要创建一个服务来公开它们还是在 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,
                ...
            };
        }
    }
    

    公开为服务的唯一真正好处是您可以稍后调用它,并获得数据的更新值(如果它已更改),而无需重新进行身份验证。

    希望对您有所帮助。

    【讨论】:

    • 嗨@Scott,当我在Authenticate 方法中访问sessionUser 对象时,它是一个没有设置值的空对象?
    • @BiffBaffBoff 在OnAuthenticated 通话之后,您是否已将var sessionUser = session as AppUserSession; 移至?我在几分钟前更改了代码?
    • 是的,我移动了它,但它仍然是空的,要我开始一个新问题吗?
    • @BiffBaffBoff 不,只需将其更改为 var sessionUser = authService.GetSession() as AppUserSession; 就可以了。
    • @BiffBaffBoff 很高兴它正在工作。我已经用那个修复更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2011-12-29
    相关资源
    最近更新 更多