从Azure Passport身份validation节点js注销

我有一个节点js应用程序,我们使用了azurelogin和通行证身份validation。

我已经成功login使用azure色和应用程序工作正常。

但是,当我注销并将url提供给页面时,它会检查身份validation并自动转到该页面而不要求login。

一旦我login我的url包含以下查询string1. session_state 2.代码3.状态4.令牌

login代码:

app.get('/login', passport.authenticate('azuread-openidconnect', { failureRedirect: '/' }), function (req, res) { res.sendFile(path.join(__dirname+'/index.html')); 

});

注销码:

 app.get('/logout', function (req, res) { req.session.destroy(); req.logout(); res.redirect('/'); }); 

当我注销页面redirect到我的索引页面。 然后,当我给'/login'的url,它把我带到页面,而无需login页面

请帮忙摆脱这个…

此问题是由OAuth 2.0的授权代码授权stream程引起的。 类似的,Azure AD OAuth 2.0服务上有任何会话。 这不是passportjsexpressjs的问题。

我们可以进行如下简单testing,访问浏览器中的authentication端点, 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

您需要先填写电子邮件和密码,完成loginstream程后,第二次访问terminal时,不再需要填写电子邮件或密码。

我们可以设置url参数prompt ,在授权端点login ,强制用户每次重新authentication。

您可以参考https://msdn.microsoft.com/en-us/library/azure/dn645542.aspx#code-snippet-3了解详情&#x3002;

但是在azure护照上,我们应该修改源代码,将param添加到端点中。

安装passport-azure-ad模块后,打开文件/node_modules/passport-azure-ad/lib/passport-azure-ad/oidcstrategy.js ,在第545行(或多或less),可以find以下代码片段:

  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';这个语句params['prompt'] = 'login'; 按照代码片段添加支持。

任何进一步的关注,请随时让我知道。

编辑

有什么办法只有当我注销时提示login…

我不太确定你的意思,你要检查用户是否在访问login路由时进行身份validation,如果是,不要提示loginstream量?

如果是这样,你可以自定义一个中间件来检查authentication。 例如:

 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('/'); }); 

看看Azure xplat的代码,他们似乎没有调用一个明确的注销函数,而是直接删除所有相关的客户端令牌。

如果没有本地令牌,则不能login!

注销应用程序并不意味着用户已从Azure注销。 当用户退出应用程序时,只需销毁应用程序为用户提供的会话即可。 当他们再次login时,它会将它们redirect到Azure(它们仍然被logging,以及应用程序仍然有权限的地方),然后通过该用户的令牌立即redirect到您的应用程序。 您需要让用户从Azure注销,让他们再次提示input凭据。