我有一个节点js应用程序,我们使用azure登录和护照身份验证。
我已经使用azure成功登录,应用程序运行正常。
但是,当我退出并将URL提供给页面时 - 它会检查身份验证并自动转到该页面而不要求登录。
一旦我登录我的url包含下面的查询字符串1. session_state 2. code 3. state 4. token
登录代码:
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('/');
});
当我注销页面时,重定向到我的索引页面。然后,当我给网址“/ login”时,它会将我带到页面,而无需登录页面
请帮忙摆脱这个......
此问题是由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 param prompt
设置为login
,以强制用户每次重新进行身份验证。
您可以参考https://msdn.microsoft.com/en-us/library/azure/dn645542.aspx#code-snippet-3了解详情。
但是在azure passport oidcstrategy中,我们应该修改源代码以将param添加到端点中。
安装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';
来添加支持。
如有任何疑问,请随时告诉我。
有没有办法在我退出时提示登录...
我不确定你的意思是,你想检查用户在访问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('/');
});
查看Azure xplat的代码,他们似乎没有调用显式注销函数,而只是删除所有相关的客户端令牌。
如果没有本地令牌,则无法登录!
注销应用程序并不意味着用户已从Azure注销。当用户退出应用程序时,您只需销毁应用程序为该用户提供的会话。当他们再次登录时,它会将它们重定向到Azure(它们仍然被记录,并且您的应用程序仍然拥有权限),然后立即使用该用户的令牌重定向回应用程序。您需要让用户从Azure注销,再次提示他们提供凭据。
1)我有同样的问题,因为passpor-azure记录我正在执行此函数注销:
logout: function(req, res) {
req.logout();
res.redirect('/');
}
但Azure登录会话保持活动状态,因此当我重新进入我的网站时,身份验证请求将自动生效,并且不会显示登录页面。
我试过@Gary Liu - MSFT建议配置提示:登录选项,但是@ user3211705已注释,这使得登录页面重新出现(即使我没有注销,我有一个portal.azure.com选项卡打开),例如当我重新启动我的服务器时(注意:这没有错,但是当我们开发时,一直重启服务器,并且一直都很难登录)
2)我的部分解决方案来自这个post:
建议调用此URL以在Azure AD注销用户:
https://login.microsoftonline.com/<tennantid>/oauth2/logout
但只有这样做并不适合所有情况。
如果我在多个窗口/标签浏览器中打开了我的网站,则用户通过调用此网址在Azure AD中无效,但我可以继续在其他标签页上使用我的网站(看起来该标签会话中的用户仍然保持静止状态活性)。
这类似于将我的网站放在一个选项卡中,另一个选项卡上打开了portal.azure.com,并在portal.azure.com中注销,这使Azure AD中的用户无效。
所以我的最终解决方案是两者兼而有之
logout: function(req, res) {
req.logout();
res.redirect('https://login.microsoftonline.com/<tennantid>/oauth2/logout');
}
这会在请求中注销我的用户并在Azure AD中调用注销身份验证。
还可以在logout url param中添加重定向uri吗?post_logout_redirect_uri =
/oauth2/logout?post_logout_redirect_uri=<your website>