首先,我们正在努力将ASP.NET Webform整体应用程序移至微服务,首先,我们使用Nginx作为代理路由器,使用Node Express作为API网关。
从浏览器,任何.aspx请求都将从Nginx路由到现有的ASP.NET Webform应用程序,新的调用将路由到API网关
直到路由一切正常为止,但问题是 session 管理,ASP.NET Webform应用程序将Redis用作 session 存储,并且我们正在尝试访问API网关的同一 session
ASP.NET将sessionID存储在“ASP.NET_SessionId” cookie中,并在Redis中为每个 session 创建两个Key,例如
session ID_数据
SessionID_Internal
我们试图在网关中将Express-redis session 设置为相同的“ASP.NET_SessionId”,但是它创建了不同的密钥
然后我们尝试获取Cookie值并尝试在API Gateway中生成相同的ID

enter code here
    app.use(session({
      genid: function(req) {
        //Get SessionID from Cookie and Return
  },
      store: new RedisStore({
       host:HOST,
       port:PORT,
       pass:PASSWORD,
       prefix: APP_PREFIX //Application Prefix used by ASP.NET
      }),

      name: 'ASP.NET_SessionId',
      secret: APP_SECRET,
      resave: false,
      saveUninitialized: false
    }));

问题是ASP.NET在每个用户 session 的Redis中创建两个密钥,因此我们无法设置API网关

有什么方法可以在API网关中共享ASP.NET Web表单 session ,或者如果我们将身份验证和 session 管理创建为单独的微服务,则该 session 可以在ASP.NET Web表单和API网关中使用,这将自动增加Redis的TTL每个请求上的键?

最佳答案

为了在Node API网关中访问ASP.NET session ,我们创建了一个中间件,并使用“ioredis”库连接到Redis session 数据库,该数据库将由ASP.NET Redis session 使用。
节点API网关必须与ASP.NET Redis session 正确同步
1.在中间件中,从Cookie读取 session 密钥
cookieSessionID=req.cookies["ASP.NET_SessionId"];

2.将_Internal({sessionID_Internal})添加到 session ID,并使用ioredis的exist方法检查Redis在Redis中是否已过期

3.如果存在 session ,则更新ASP.NET session 的_Internal和_data密钥的生存时间(在ioredis中,您可以通过expire()方法设置密钥的到期时间)

关于asp.net - 将Monolith ASP.NET Webform应用程序移至微服务和 session 管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53606744/

10-12 03:24