在ServiceStack上处理未经过身份验证的会话的推荐方法

时间:2017-08-30 07:41:26

标签: c# asp.net-mvc cookies servicestack

我有一个MVC应用程序,SS集成了所有具有购物篮功能的BLL。我希望匿名用户能够添加到购物篮,然后在返回时保持篮子细节完整购物 - 所以我觉得在redis中使用ss-pid for sessionId是最好的方法。

有人可以确认我是否正确处理此问题,如果是,我该如何启用此功能? (我无论如何都看不到默认使用ss-pid。)

感谢。

1 个答案:

答案 0 :(得分:1)

如果您想使用会话Cookie存储未经身份验证的用户信息,那么您需要设置:

Plugins.Add(new AuthFeature(...) {
    GenerateNewSessionCookiesOnAuthentication = false
});

因此,当用户进行身份验证时,它会保留现有的Cookie,否则您将需要设置和使用自己的Cookie,这些Cookie在用户登录时不受影响。

SessionBag是一个很好的解决方案,它使用用户会话Cookie来存储未经身份验证的用户的会话数据,例如:您可以使用以下内容填充自定义POCO:

var unAuthInfo = SessionBag.Get<UnAuthInfo>() ?? new UnAuthInfo();
unAuthInfo.CustomInfo = request.CustomInfo;
SessionBag.Set(unAuthInfo);

然后,当用户进行身份验证时,从会话包中检索信息并使用OnAuthenticated()事件将其添加到您的Typed Custom UserSession上,例如:

public class CustomUserSession : AuthUserSession
{
    [DataMember]
    public string CustomInfo { get; set; }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, 
        IAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        var unAuthInfo = authService.GetSessionBag().Get<UnAuthInfo>();

        if (unAuthInfo != null)
            this.CustomInfo = unAuthInfo.CustomInfo;
    }
}