2017-07-08 125 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

謝謝!非常感激! –