Passport Saml Loop

时间:2016-01-06 12:01:55

标签: node.js passport.js mean-stack adfs

我正在尝试在nodejs / angularjs项目中使用Passport-Saml.js进行ADFS识别。

  1. 当我连接到我的网站时,我已正确地重定向到我的ADFS门户网站。
  2. ADFS门户,在身份验证后正确重定向到回调。
  3. 然后是回调循环。
  4. Chrome console when it's looping

    我的路线(server.js):

    app.post('/login/callback',
     function (req, res, next) {
      console.log('before');
      passport.authenticate('saml', function (err, user, info){
        console.log('good');
    
    })(req, res, next);
    
    });
    

    我认为它停止在passport.authenticate('saml',函数(错误,用户,信息)}工作{因为“之前”输出消息可以在控制台中看到,但也不是屏幕截图中看到的“好”。 The console

    我的护照配置(/config/passport.js):

    var
     fs = require('fs')
     , passport = require('passport')
     , SamlStrategy = require('passport-saml').Strategy
    ;
    
    passport.serializeUser(function (user, done) {
     done(null, user);
    });
    passport.deserializeUser(function (user, done) {
     done(null, user);
    });
    
    passport.use(new SamlStrategy(
    {
      entryPoint: 'https://logon.XXX.com/adfs/ls/',
      issuer: 'urn:backpack-test',
      callbackUrl: ' https://backpack-test.XXX.com/login/callback',
      cert: 'MIIC6D...,
      authnContext:         'http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password',
      //acceptedClockSkewMs: -1,
      identifierFormat: null,
      //signatureAlgorithm: 'sha256'
    },
    function (profile, done) {
     return done(null,
      {
            upn: profile['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'],
            // e.g. if you added a Group claim
            group: profile['http://schemas.xmlsoap.org/claims/Group']
        });
        }
        ));
    
    module.exports = passport;
    

    我怀疑我的设置可能不正确但是有任何详细的护照日志 - Saml以缩小我的故障排除。

2 个答案:

答案 0 :(得分:5)

可能是这个问题: Check this bug

只需添加正文解析器

即可
var bodyParser = require('body-parser');
...
app.use(bodyParser.urlencoded({extended: true}));

它对我有用。也许它可以帮助别人......

答案 1 :(得分:0)

感谢英仙座,我只添加了一个注释。我正在使用:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '5mb'}));

,我认为这已经足够了,但事实并非如此,因为正文解析器忽略了经过urlencoded的请求。所以我必须同时指定:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '5mb'}));
app.use(bodyParser.urlencoded({extended: true}));