SPA客户端访问ServiceStack会话

时间:2017-07-08 15:42:45

标签: angular session cookies servicestack

我正在开发基于ServiceStack的Web服务支持的Angular 4中的SPA,并希望使用SPA来检查用户是否已使用后端中针对自定义身份验证提供程序实现的Redis缓存客户端进行身份验证,而不是让他们使用再次登录。因此,当用户登录到另一个基于ServiceStack的应用程序时,该应用程序也启用了Redis缓存客户端并转移到此应用程序的链接(作为同一域中的另一个应用程序托管),他们不必登录。我应该是当我将它们转移到新的应用程序时,将任何cookie或任何东西传递给新的应用程序?任何指针将不胜感激。

ServiceStack Authentication Documentation描述了使用HTTP标头发送会话cookie的概念。这是我可以利用的内容以及应用程序生命周期中的方式和位置,我可以捕获此信息以检查用户是否已登录?任何指针都会受到赞赏。

由于

约翰

1 个答案:

答案 0 :(得分:3)

如果您有2个不同的ServiceStack实例配置为使用相同的Redis缓存提供程序和自定义身份验证提供程序,那么您只需要发送相同的Session Cookies,以便在两者中都被视为已通过身份验证。

  

(作为同一域中的另一个应用程序托管)

如果它托管在不同主机的同一域中,例如:

domain.com/app1
domain.com/app2

然后,当向任一应用程序发出Ajax请求时,将自动发送会话Cookie。

但是,如果应用程序位于不同的子域中,例如:

app1.domain.com
app2.domain.com

默认情况下,它们被视为2个不同的域,无法共享Cookie,但您可以指定Cookie应该应用于您的根域,而不是在Web.config中配置它:

<system.web>
    <httpCookies domain=".domain.com" />
</system.web>

您的Ajax请求将向两个子域发送Cookie。

如果您在两个不同的域中托管了应用,则无法共享Cookie,在这种情况下,您可以尝试将其作为Custom HTTP Headers发送,如果您使用ServiceStack的TypeScript JsonServiceClient,则可以使用以下内容填充:< / p>

 var client = new JsonServiceClient(baseUrl);
 client.headers.set('X-ss-id', sessionId);

然后问题变得允许Ajax客户端跨域发送自定义HTTP标头,您需要在CorsFeature中注册,例如:

Plugins.Add(new CorsFeature(
    allowOriginWhitelist: new[] { "http://source.domain.com" },
    allowCredentials: true,
    allowedHeaders: "Content-Type, Allow, Authorization, X-ss-id"));

注意:会话ID在ss-id Cookie中返回,或者您可以通过从经过身份验证的用户调用/auth端点,从AuthenticateResponse DTO获取会话ID。

相关问题