需要シナリオ
- ウェブサイトのA、ドメイン名a.site.com
- サイトB、ドメイン名b.site.com
- セッションの2つのサイトB、間で共有する必要があります
ソリューション
- Redisのは、分散キャッシュストレージとして使用します
- 、保存されたセッションIDクッキードメイン名を設定するので、同じセッションIDを読み取ることができる二つの部位6月
services.AddDistributedRedisCache(options => //使用redis { options.Configuration = $"{conf},defaultDatabase={dbId}"; }); services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.Domain = "site.com"; });
カスタムSessionMiddlewareの
CookieProtectionのクラスはセッションIDを暗号化し、前記SessionMiddlewareのAsp.netは、異なるアプリケーションセッションIDで同じ結果が、暗号化され作られたセッションIDの真ん中に来る、しかし、具体的な詳細をセッションの成功を共有しないSessionMiddlewareの元メンバーので、
public async Task Invoke(HttpContext context) { .... if (string.IsNullOrWhiteSpace(sessionKey) || sessionKey.Length != SessionKeyLength) { // No valid cookie, new session. var guidBytes = new byte[16]; CryptoRandom.GetBytes(guidBytes); sessionKey = new Guid(guidBytes).ToString(); cookieValue = CookieProtection.Protect(_dataProtector, sessionKey); var establisher = new SessionEstablisher(context, cookieValue, _options); tryEstablishSession = establisher.TryEstablishSession; isNewSessionKey = true; } ... }
SessionMiddlewareのは、直接依存クラスCookieProtectionがあるので、それはセッションを処理するために、独自のミドルウェアを再実装する必要があり、そのようMySessionMiddlewareの実現として、あなたは共有セッションを達成することができます
public async Task Invoke(HttpContext context) { .... if (string.IsNullOrWhiteSpace(sessionKey) || sessionKey.Length != SessionKeyLength) { // No valid cookie, new session. var guidBytes = new byte[16]; CryptoRandom.GetBytes(guidBytes); sessionKey = new Guid(guidBytes).ToString(); cookieValue = Md5(sessionKey);//此处可以使用自己的加密规则,重要的是保证不同的应用,通过加密规则生成的值是相同的 var establisher = new SessionEstablisher(context, cookieValue, _options); tryEstablishSession = establisher.TryEstablishSession; isNewSessionKey = true; } ... }
netcoreクロスアプリケーション分散セッション
おすすめ
転載: www.cnblogs.com/zcode/p/11563334.html
おすすめ
ランキング