2

我正在使用 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 标头中返回?

4

1 回答 1

3

我需要创建一个公开它们的服务还是在 HTTP 标头中返回?

默认情况下,ServiceStack 不会以任何方式公开您添加到会话的自定义参数。

从登录结果公开:

作为成功响应的一部分,您可以在登录响应中返回此信息。

目前,ServiceStack 的默认响应CredentialsAuthProvider是:

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

Authenticate您可以通过覆盖该方法在自定义身份验证提供程序中对此进行自定义。

此方法中的大部分代码都是从原始CredentialsAuthProvider身份验证方法(此处)复制而来,然后适用于使用您的自定义会话类型(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,
            ...
        };
    }
}

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

希望有帮助。

于 2014-05-14T10:48:01.570 回答