2017-07-08 124 views
2

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

ServiceStack Authentication Documentation描述了使用HTTP头发送会话cookie的概念。这是我可以利用的东西,以及应用程序生命周期中的方式和位置可以捕获这些信息以检查用户是否已登录?任何指针将不胜感激。

感谢

约翰

回答

2

如果配置为使用相同的Redis缓存提供商和自定义验证提供者,那么你只需要发送相同Session Cookies以2个不同的ServiceStack实例被作为身份验证的治疗同时。

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

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

domain.com/app1 
domain.com/app2 

那么会话cookie将被自动发送向任一应用程序发出Ajax请求时。

但是如果某个应用的是在不同的子域,例如:

app1.domain.com 
app2.domain.com 

他们视为默认2个不同的领域,这将无法共享Cookie,但您可以指定饼干应适用于您的根域,而不是由你Web.config配置它:

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

在您的Ajax请求将发送cookie到两个子域。

如果应用程序在2个不同的域承载您将无法共享cookies在这种情况下,你可以尝试把他们作为Custom HTTP Headers如果您使用的是哪个ServiceStack的TypeScript JsonServiceClient你可以填充它:

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

的那么问题就变成了让Ajax客户端跨您需要在您的CorsFeature注册域名,例如发送自定义HTTP标头:

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

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

+0

谢谢!非常感激! –