首先,我们正在努力将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/