最近、コア測定環境のasp.netサイトの外側を使って同社は、状況が常に失われたセッションを発見しました。長い時間のための調査、クライアント.AspNetCore.Sessionクッキーが失われることはありませんが、コピーが使用する分散キャッシュの主なセッションでも何の問題も見つからなかったが、また、クッキー代替ソリューションを使用したいのですが、根本的な問題を解決していなかった、いつもの感触としてのRedis地獄の喉に魚のスティック。その後、調査の過程で、私たちは、実際には、時には別のWebサーバーにロードnginxのことで、同じクライアントを発見したnginxのが確認され、ip_hashああによって転送され、フレーズの際、同社の運用・保守を混同しました壊れた、元の会社は、2線式のルータを使用することです。私はクッキーの暗号化キーを保存するかどうかを推測するように、異なるサーバー上が生じるため。
Microsoftのセッションのオープンソースは、最初に次のキーソースを持っているSessionMiddlewareのミドルウェアコードを、確認してください。
VARにcookievalue = context.Request.Cookies [_options.CookieName]。 VAR SESSIONKEY = CookieProtection.Unprotect(_dataProtector、にcookievalue、_logger)。 もし(文字列 .IsNullOrWhiteSpace(SESSIONKEY)|| sessionKey.Length!= SessionKeyLength) { // 有効なクッキー、新しいセッション。 VaRの guidBytes = 新しい バイト [ 16 ]。 CryptoRandom.GetBytes(guidBytes)。 SESSIONKEY = 新しいのGUID(guidBytes)()を.ToString。 cookievalue =CookieProtection.Protect(_dataProtector、SESSIONKEY)。 VaRの開設者= 新しいSessionEstablisher(コンテキスト、にcookievalue、_options)。 tryEstablishSession = establisher.TryEstablishSession。 isNewSessionKey = 真; }
SESSIONKEYは_dataProtectorからCookieProtectionこのうち、クライアントのクッキーから解読されます
1
|
_dataProtector = dataProtectionProvider.CreateProtector(nameof(SessionMiddleware));
|
拾い出しIDataProtectionProviderデフォルトの注入:
発見IDataProtectionProviderはのKeyManagerのIDataProtectionProviderとして、Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProviderです
Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager。
右合図に、単一マシン上のキーが存在、ビューでMicrosoftのオープンソースDataProtection-devのキーストレージ・パスを達成するために取得FileSystemXmlRepository:
Redisのを達成するための重要な持続性の下でのプロジェクトがあることを鋭い目が見つかりました:
NugetはConfigureServices方法を変更し、適切なパケットを追加します。
services.AddDataProtection()
.PersistKeysToRedis(ConnectionMultiplexer.Connect(redisConnection)、dataProtectionKey)。
そして最後に完璧なソリューション!分散ストレージセッションを使用する場合は、最高のは、キーdataProtectionProviderも共有されることになり、またはあなたがip_hash負荷分散を行う場合は、クライアントのIPが変更され、Cookieストアのセッションデータ復号うちで、その結果、別のサーバーにロードすることができこれにより、より少ないセッションを取得!