【问题标题】:Loging out of Azure Passport authentication Node js注销 Azure Passport 身份验证节点 js
【发布时间】:2018-10-10 23:22:20
【问题描述】:

我有一个 node js 应用程序,我们在其中使用了带有护照身份验证的 azure 登录。

我已使用 azure 成功登录,应用程序运行正常。

但是,当我注销并将 URL 提供给页面时 - 它会检查身份验证并自动转到该页面而不要求登录。

登录后,我的 url 包含以下查询字符串 1. session_state 2.代码 3. 状态 4.令牌

登录代码:

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' 提供给 url 时,它会将我带到该页面而无需登录页面

请帮助摆脱这个...

【问题讨论】:

    标签: node.js azure passport.js


    【解决方案1】:

    此问题是由 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参数promptlogin,强制用户每次重新认证。

    详情可参考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('/');
    });
    

    【讨论】:

    • 谢谢你..现在它每次都提示登录...有没有办法只在我注销时提示登录...目前它在我登录时提示登录然后去再次到登录页面...它必须重定向到其他页面...
    • 已更新,请检查是否符合您的要求。
    【解决方案2】:

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

    【讨论】:

    • OK.. 是否也可以注销 Azure.. 有没有这方面的参考或教程..
    【解决方案3】:

    1) 我遇到了同样的问题,正如 passpor-azure 记录的那样,我正在执行此功能以注销:

     logout: function(req, res) {
        req.logout();
        res.redirect('/');
      }
    

    但是 Azure 登录会话保持活跃,所以当我重新进入我的网站时,autentication 请求将自动生效,并且不会显示登录页面。

    我尝试了@Gary Liu - MSFT 建议配置 prompt:login 选项,但有 @user3211705 评论,这使得登录页面重新出现(即使我没有注销并且我有一个门户.azure.com 选项卡打开),例如当我重新启动服务器时(注意:这并没有错,但是当我们正在开发时,总是重新启动服务器,并且一直登录很烦人)

    2) 我的部分解决方案来自post:

    建议调用此 url 以在 Azure AD 中注销用户:

    https://login.microsoftonline.com/<tennantid>/oauth2/logout
    

    但仅这样做并不适用于所有情况。

    如果我的网站在多个窗口/选项卡浏览器中打开,则用户在 Azure AD 中通过调用此 url 变得无效,但我可以继续在另一个选项卡上使用我的网站(看起来该选项卡中的用户会话保持活动状态)。

    这类似于将我的网站放在一个选项卡上,然后在另一个选项卡上打开 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 中调用注销身份验证。

    仍然可以在注销 url 参数中添加重定向 uri ?post_logout_redirect_uri=

    /oauth2/logout?post_logout_redirect_uri=<your website>
    

    【讨论】:

    • 注意: 必须在 azure 应用程序配置中已批准的回复 URL 列表中。
    【解决方案4】:

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

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

    【讨论】:

    • 我尝试清除本地存储,如 id_token、session_state、状态和代码...但仍然没有注销...还有其他需要在 azure 中手动清除吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2017-03-20
    • 2022-08-23
    • 2013-09-22
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多