这个问题是由OAuth 2.0的授权码授权流引起的。类似于Azure AD OAuth 2.0服务上没有任何会话的情况。这不是
passportjs
或
expressjs
的问题。
我们可以进行以下简单的测试,在浏览器中访问认证端点:
https://login.microsoftonline.com/common/oauth2/authorize?response_type=id_token%20code&client_id=<client_id>&redirect_uri=<redirect_uri>&response_mode=query&scope=openid
您需要先填写电子邮件和密码,完成登录流程后,第二次访问端点时,您将不再需要填写电子邮件或密码。
我们可以在授权端点中设置url参数
prompt
为
login
,以强制用户每次重新进行身份验证。
您可以参考
https://msdn.microsoft.com/en-us/library/azure/dn645542.aspx#code-snippet-3获取详细信息。
但在Azure Passport OIDC策略中,我们应该修改源代码以添加参数到端点中。
安装
passport-azure-ad
模块后,打开文件
/node_modules/passport-azure-ad/lib/passport-azure-ad/oidcstrategy.js
,在第545行(左右)处,您可以找到以下代码片段:
var params = {};
if (self.authorizationParams) { params = self.authorizationParams(options); }
params['response_type'] = config.responseType;
log.info('We are sending the response_type: ', params['response_type']);
params['client_id'] = config.clientID;
params['redirect_uri'] = callbackURL;
...
我们可以在代码片段后添加句子
params ['prompt'] ='login';
来添加支持。
如果还有任何疑问,请随时让我知道。
编辑
是否有办法只在注销时提示登录...
我不确定你的意思是什么,你想在访问
登录
路由时检查用户是否已经验证过,如果是,则不提示登录流程吗?
如果是这样,您可以自定义一个中间件来检查身份验证。例如:
function checkAuthenticatedOnLogin(req,res,next){
if (!req.isAuthenticated()) {
return next();
}else{
res.send('do not need login');
}
}
app.get('/login',checkAuthenticatedOnLogin,
passport.authenticate('azuread-openidconnect',{ failureRedirect: '/login' }),
function(req, res) {
log.info('Login was called in the Sample');
res.redirect('/');
});