2016-10-03 11 views
3

私のプロジェクトでServiceStackをベースライブラリとして使用しています。 私は、別々のプロジェクトとリポジトリである2つの部分のAPIとWEBアプリケーションで自分のアプリケーションを構造化しました。負荷分散環境でのServiceStackセッション処理

認証はAPIレイヤーで行われる必要があり、そのレイヤーにキャッシュする必要があります。私はAPIサーバでOrmliteキャッシュクライアントを使用しています。 APICredentialsAuthProviderで

APIのAppHost.csで

var dbFactory = new OrmLiteConnectionFactory("ConnectionString",SqlServerDialect.Provider); 
container.RegisterAs<OrmLiteCacheClient, ICacheClient>(); 
container.Resolve<ICacheClient>().InitSchema(); 
Plugins.Add(new AuthFeature(() => new APISession(), 
    new IAuthProvider[] { 
    new APICredentialsAuthProvider(new AppSettings()) 
})); 

私は返すapiurl/authを使ってAjaxの呼び出しを介して、Webアプリケーションでユーザーを認証していますCacheEntryテーブル

にDBに格納されますセッションを保存していますAuthenticateResponsesessionIdを付けてください。
ss-idまたはss-pidに更新されている要求の種類に基づいて、プレリクエストフィルタでs-id以降のCookieにこのsessionIdを更新しています。

//Inside Web application apphost 
this.PreRequestFilters.Add((req, res) => 
{ 
    System.Net.Cookie cookie = req.Cookies["s-id"]; 
    req.Cookies["ss-id"] = cookie; 
    req.SetSessionId(cookie.Value) 
}); 

このアプローチでは、WebおよびAPIアプリケーションで提供して私の場合とそれぞれの構成でOrmliteあるキャッシュからセッションを取得しません。

これを達成する最も良い方法は何ですか?私は

//Inside Web application apphost 
this.PreRequestFilters.Add((req, res) => 
{ 
    System.Net.Cookie cookie = req.Cookies["s-id"]; 
    req.Cookies["ss-id"] = cookie; 
    req.SetSessionId(cookie.Value); 
APISession cachedSession = GetCacheClient(req).Get<APISession(SessionFeature.GetSessionKey(cookie.Value)); 
WEBSession session.PopulateWith<WEBSession, APISession>(cachedSession); 

}); 

これが正常に動作し、私はセッションを取得することができていますが、事前リクエストフィルタでこれを置くことによって、キャッシュ・クライアントを使用してセッションにアクセスすることができる午前しかし

は、DBからの呼び出しを増加させ、私のWebアプリケーション(リクエストごとに)。

これを達成するための代替ソリューションはありますか?

ありがとうございます!

答えて

3

あなたはアプリのいずれかに要求を行うときが、その後ServiceStackのss-id/ss-pidクッキーが送信されますdistributed Caching ProvidersOrmLiteCacheClient等のいずれを使用して、同じドメインの背後にある負荷分散複数のWebアプリある場合:

http://example.org/app1 -> http://internal:8001/ 
        /app2 -> http://internal:8002/ 
        /app3 -> http://internal:8003/      

その後、各アプリケーションが同じOrmLiteCacheClientで構成されている限り、1つのアプリケーションで作成されたセッションは3つのアプリケーションすべてに表示されます。

あなたは例えば、IRequest.Itemsでそれを設定することによって、その要求のセッションを取得するために、さらにDBへのアクセスを防ぐことができます。

req.Items[Keywords.Session] = session; 

そして、その要求のセッションへのアクセスではなくIRequestアイテム辞書から解決されますDBを叩く

3つのAppsすべてで認証できる別の認証ソリューションは、ステートレスJWT Auth Providerを使用することです。

関連する問題