此问题是由 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 oidcstrategy 中,我们应该修改源代码以将参数添加到端点中。
安装passport-azure-ad模块后,打开文件/node_modules/passport-azure-ad/lib/passport-azure-ad/oidcstrategy.js,在第545行(或多或少),可以找到以下代码sn -p:
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;
...
我们可以在sn-p代码后面加上句params['prompt'] = 'login';来添加支持。
如有任何疑问,请随时告诉我。
编辑
有没有什么方法可以在我登出时才提示登录...
我不确定您的意思是,您要检查用户访问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('/');
});