netcoreクロスアプリケーション分散セッション

  • 需要シナリオ

    • ウェブサイトの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;
            }
            ...
        }

おすすめ

転載: www.cnblogs.com/zcode/p/11563334.html