从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服务上有任何会话。 这不是passportjs
或expressjs
的问题。
我们可以进行如下简单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了解详情。
但是在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凭据。
- 在Azure网站中,node.js可用的端口是什么?
- 设置根path以在Azure上提供index.html(IIS Web服务器)
- 我可以通过复制文件在Azure节点应用程序服务器上部署node.js吗?
- Azure不能正确发布Node.js应用程序
- 在Azure网站上从文件系统安装Node.js模块
- azure-functions-cli:func init spits错误“No such file or directory”
- 快速有效地创buildCSV文件报告,而不会减慢node.js服务器的速度
- 从bitbucket的Node.js应用程序azure色的部署
- azure node.js console.log不能login到stdout或stderr文件