0

我有一个 ServiceStack 4 API 项目和一个 MVC 5 Web 项目,我希望他们共享用户的会话数据。

两个项目都已配置为使用相同的 Redis 实例作为缓存。

我的 MVC 控制器继承自 ServiceStackController。

会话是由 API 创建的(我可以看到返回的 cookie 并通过会话 id 查询对象的 Redis)。

我苦苦挣扎的地方是 MVC 项目如何知道会话 ID。最初我认为 JsonServiceClient 上的 ShareCookiesWithBrowser 可能会起作用,但似乎没有。

因此,我向 JsonServiceClient 添加了请求和响应过滤器,以将网站的 cookie 添加到 API 请求,并将 API 响应 cookie 添加到网站响应 cookie。这似乎在 API 调用和 Web 请求 ss-id 和 ss-pid cookie 匹配的意义上起作用,并且会话对象在 Redis 中可用。不幸的是,当我调用 MVC 控制器上的 UserSession 属性(来自 ServiceStackController 基础)时,会引发 NullReferenceException。

如果有人能让我知道我错过了什么或做错了什么,那将不胜感激。

更新

刚刚发现 ServiceStackController 上的 Cache 属性为空。我猜它通常是由 Funq 注入的属性,但我们使用的是 SimpleInjector 并避免了属性注入。

很高兴知道我是否必须通过 JsonServiceClient 手动来回传递 cookie。在像 ServiceStack 这样经过深思熟虑的事情上,它似乎有点老套——我仍然忍不住想我错过了一些东西。

谢谢,

史蒂夫。

4

1 回答 1

0

您不需要使用 HTTP 服务客户端从 MVC 调用 ServiceStack 服务,因为您可以直接使用 C# 调用 ServiceStack 服务。以下是新的ServiceStack + MVC 测试项目中的一些示例,展示了如何登录:

public ActionResult Login(string userName, string password, string redirect=null)
{
    if (ModelState.IsValid)
    {
        try
        {
            using (var authService = ResolveService<AuthenticateService>())
            {
                var response = authService.Authenticate(new Authenticate
                {
                    provider = CredentialsAuthProvider.Name,
                    UserName = userName,
                    Password = password,
                    RememberMe = true,
                });

                // add ASP.NET auth cookie
                FormsAuthentication.SetAuthCookie(userName, true);

                return Redirect(string.IsNullOrEmpty(redirect) ? "/" : redirect);
            }
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
        }
    }

    var session = SessionAs<CustomUserSession>();
    return View("Index", session);
}

并注销:

public ActionResult Logout()
{
    using (var authService = ResolveService<AuthenticateService>())
    {
        var response = authService.Authenticate(new Authenticate {
            provider = AuthenticateService.LogoutAction,
        });

        // add ASP.NET auth cookie
        FormsAuthentication.SignOut();
    }

    return Redirect("/");
}

您可以使用部署在http://mvc.servicestack.net/的 MVC 测试项目- 它显示登录、注销和从 MVC 访问 ServiceStack 的类型化会话。

还要检查项目中的会话服务,它显示了如何在自定义用户会话的OnAuthenticated()事件中检索、编辑和添加自定义逻辑,以将未经身份验证的会话数据复制到经过身份验证的类型会话中,如前面的答案中所述。

该项目确实利用了v4.0.32+中添加的一些较新的 API,这些 API 现在可以在 MyGet 上使用

于 2014-09-18T14:57:07.977 回答