注销Azure Passport身份验证节点js

问题描述 投票:2回答:4

我有一个节点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”时,它会将我带到页面,而无需登录页面

请帮忙摆脱这个......

node.js azure passport.js
4个回答
2
投票

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

我们可以进行以下简单测试,访问浏览器中的认证端点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('/');
});

0
投票

查看Azure xplat的代码,他们似乎没有调用显式注销函数,而只是删除所有相关的客户端令牌。

如果没有本地令牌,则无法登录!


0
投票

注销应用程序并不意味着用户已从Azure注销。当用户退出应用程序时,您只需销毁应用程序为该用户提供的会话。当他们再次登录时,它会将它们重定向到Azure(它们仍然被记录,并且您的应用程序仍然拥有权限),然后立即使用该用户的令牌重定向回应用程序。您需要让用户从Azure注销,再次提示他们提供凭据。


0
投票

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>
© www.soinside.com 2019 - 2024. All rights reserved.