我正在开发基于ServiceStack的Web服务支持的Angular 4中的SPA,并希望使用SPA来检查用户是否已使用后端中针对自定义身份验证提供程序实现的Redis缓存客户端进行身份验证,而不是让他们使用再次登录。因此,当用户登录到另一个基于ServiceStack的应用程序时,该应用程序也启用了Redis缓存客户端并转移到此应用程序的链接(作为同一域中的另一个应用程序托管),他们不必登录。我应该是当我将它们转移到新的应用程序时,将任何cookie或任何东西传递给新的应用程序?任何指针将不胜感激。
ServiceStack Authentication Documentation描述了使用HTTP标头发送会话cookie的概念。这是我可以利用的内容以及应用程序生命周期中的方式和位置,我可以捕获此信息以检查用户是否已登录?任何指针都会受到赞赏。
由于
约翰
答案 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。