.Net Core 应用程序如何从 Expressjs 会话进行身份验证?
How .Net Core app can authenticate from Expressjs session?
第一个应用是在Expressjs上开发的。
身份验证模块:
passport.js
express-session
cookie-parser
connect-mongo
会话中间件
app.use(
session({
secret: 'kkkjfdfdf787dfdfdf7SSDSf7787asXZ',
store: new MongoStore({ url: mongoData.url, mongoOptions: {useUnifiedTopology: true}}),
name: 'nature_app',
rolling: true,
resave: true,
saveUninitialized: false,
cookie: {
secure: false,
maxAge: process.env.MAX_SESS_AGE_SEC * 1000
}
})
)
Mongodb登录后session采集获取数据:
{
"_id" : "OtNPaWfyE6tpkfpIWh-m7XvCAp3No-JN",
"expires" : ISODate("2019-09-21T16:04:18.732+03:00"),
"session" : "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2019-09-21T13:04:18.732Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"csrfSecret\":\"rz_etmj7859KAC0OQRCPiyRF\",\"flash\":{},\"passport\":{\"user\":3143}}"
}
Cookie (nature_app) ID:
s%3AOtNPaWfyE6tpkfpIWh-m7XvCAp3No-JN.8Yy2SKhGyt3NCEdka90JmEyrdphPas1yt6OHabDeqis
现在我正在开发第二个应用程序 - 使用 .Net Core 3 的管理面板,EntityFramework。这两个应用程序将进入同一个域。第一个应用:wow-nature.com,第二个:wow-nature.com/admin。
如果用户登录到 Expressjs 应用程序,并单击管理面板 link - .Net Core 必须自动登录(如 SSO)。管理面板将没有登录面板。
我找到了三个选择,但出于安全原因我怀疑:
- .Net Core 必须读取 Expressjs cookie id 并在 MongoDb 中检查它。如果会话有效 - .Net Core 将对会话进行身份验证。之后.Net Core 必须重新生成会话 ID。但是我的 cookie id 和 mongodb id 不同:
s%3AOtNPaWfyE6tpkfpIWh-m7XvCAp3No-JN.8Yy2SKhGyt3NCEdka90JmEyrdphPas1yt6OHabDeqis != OtNPaWfyE6tpkfpIWh-m7XvCAp3No-JN
而且 - 这种方法安全吗?
Jwt. I don't know how .Net Core works with web tokens. I read about authencation users from Laravel to Nodejs。在其他地方我读到关于它的安全疑虑。
我很困惑。对不起,我是这种情况的初学者。
.Net Core 应用从 Expressjs 应用进行身份验证的哪种方式更安全?
最佳做法是什么?
我从 Asp.Net 核心开发人员那里得到了答案 - 这是不可能的。出于安全原因,我们无法访问 .Net 核心 cookie 修改。
所以,我重新创建了应用程序:
- 使用 IdentityServer (OpenId) 进行主要身份验证。
- Expressjs 是客户端。
- 其他 .Net Core 应用程序也是客户端。
更好的方法是按标准工作。无需重新发明自行车。
第一个应用是在Expressjs上开发的。 身份验证模块:
passport.js
express-session
cookie-parser
connect-mongo
会话中间件
app.use(
session({
secret: 'kkkjfdfdf787dfdfdf7SSDSf7787asXZ',
store: new MongoStore({ url: mongoData.url, mongoOptions: {useUnifiedTopology: true}}),
name: 'nature_app',
rolling: true,
resave: true,
saveUninitialized: false,
cookie: {
secure: false,
maxAge: process.env.MAX_SESS_AGE_SEC * 1000
}
})
)
Mongodb登录后session采集获取数据:
{
"_id" : "OtNPaWfyE6tpkfpIWh-m7XvCAp3No-JN",
"expires" : ISODate("2019-09-21T16:04:18.732+03:00"),
"session" : "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2019-09-21T13:04:18.732Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"csrfSecret\":\"rz_etmj7859KAC0OQRCPiyRF\",\"flash\":{},\"passport\":{\"user\":3143}}"
}
Cookie (nature_app) ID:
s%3AOtNPaWfyE6tpkfpIWh-m7XvCAp3No-JN.8Yy2SKhGyt3NCEdka90JmEyrdphPas1yt6OHabDeqis
现在我正在开发第二个应用程序 - 使用 .Net Core 3 的管理面板,EntityFramework。这两个应用程序将进入同一个域。第一个应用:wow-nature.com,第二个:wow-nature.com/admin。 如果用户登录到 Expressjs 应用程序,并单击管理面板 link - .Net Core 必须自动登录(如 SSO)。管理面板将没有登录面板。
我找到了三个选择,但出于安全原因我怀疑:
- .Net Core 必须读取 Expressjs cookie id 并在 MongoDb 中检查它。如果会话有效 - .Net Core 将对会话进行身份验证。之后.Net Core 必须重新生成会话 ID。但是我的 cookie id 和 mongodb id 不同:
s%3AOtNPaWfyE6tpkfpIWh-m7XvCAp3No-JN.8Yy2SKhGyt3NCEdka90JmEyrdphPas1yt6OHabDeqis != OtNPaWfyE6tpkfpIWh-m7XvCAp3No-JN
而且 - 这种方法安全吗?
Jwt. I don't know how .Net Core works with web tokens. I read about authencation users from Laravel to Nodejs。在其他地方我读到关于它的安全疑虑。
我很困惑。对不起,我是这种情况的初学者。
.Net Core 应用从 Expressjs 应用进行身份验证的哪种方式更安全? 最佳做法是什么?
我从 Asp.Net 核心开发人员那里得到了答案 - 这是不可能的。出于安全原因,我们无法访问 .Net 核心 cookie 修改。 所以,我重新创建了应用程序:
- 使用 IdentityServer (OpenId) 进行主要身份验证。
- Expressjs 是客户端。
- 其他 .Net Core 应用程序也是客户端。
更好的方法是按标准工作。无需重新发明自行车。