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 に答える