很抱歉,如果这是一个傻瓜问题,但我在理解如何将客户端浏览器重定向回到我们的SAML身份提供商(IdP)成功验证后最初请求的任何URL时遇到一些麻烦.我正在使用最新版本的护照 - 护照,护照和快递.
例如,假设客户端最初/foo/bar从另一个未受保护的页面上的链接请求,但由于这是受保护的资源,我会使用重定向进行响应/login,这是我调用的地方passport.authenticate('saml').
app.get('/login', passport.authenticate('saml'));
function ensureAuth(req, res, next) {
if (req.user.isAuthenticated()) {return next();}
else {res.redirect('/login');}
}
app.get('/foo/bar', ensureAuth, function(req, res) {
...
});
Run Code Online (Sandbox Code Playgroud)
该调用将浏览器重定向到我的IdP的登录页面,并且在成功验证后,IdP POST返回到我的/login/callback路由.在那条路线中,我再次passport.authenticate(saml)用来验证响应SAML,如果一切都好,我就可以将浏览器重定向回所请求的资源......但是我怎么知道请求的资源是什么?因为它是一个POST回调,我丢失了与原始请求相关的任何状态.
app.post('/login/callback', passport.authenticate('saml'), function(req, res) {
res.redirect('...can I know which url to redirect back to?...');
});
Run Code Online (Sandbox Code Playgroud)
passport-saml自述文件中的示例只显示了一个硬编码重定向回到根资源,但我想重定向回原始请求的URL(/foo/bar).
我可以向IdP发送一个url或其他值,这些ID将在SAML响应中进行往返并回发吗?如果是这样,我如何在我的/login/callback路线中访问它?
还是有一些更好的,快递/护照方式来做到这一点,我错过了?
您将提供的任何帮助将非常感谢!
我对使用passport-saml进行身份验证时注销用户的正确方法有疑问.
带护照-saml的示例脚本显示如下:
app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)
据我所知,这将结束本地护照会话,但它似乎没有向SAML IdP发送注销请求.当用户进行另一次登录时,它会重定向到IdP,但会立即重新定向到经过身份验证的用户.有没有办法使用IdP注销,以便用户在登录我的网站时必须再次输入密码?我见过其他使用我们IdP的网站这样做,所以我认为这是可能的.
我在passport-saml代码中注意到logout(),在passport-saml策略对象上有一个方法,似乎没有被调用req.logout().所以我尝试将代码切换为:
app.get('/logout', function(req, res) {
//strategy is a ref to passport-saml Strategy instance
strategy.logout(req, function(){
req.logout();
res.redirect('/');
});
});
Run Code Online (Sandbox Code Playgroud)
但是我在XMLNode.js中得到了这个错误
Error: Could not create any elements with: [object Object]
at XMLElement.module.exports.XMLNode.element (/.../node_modules/passport-saml/node_modules/xmlbuilder/lib/XMLNode.js:74:15)
at XMLElement.module.exports.XMLNode.element (/.../node_modules/passport-saml/node_modules/xmlbuilder/lib/XMLNode.js:54:25)
at XMLElement.module.exports.XMLNode.element (/.../node_modules/passport-saml/node_modules/xmlbuilder/lib/XMLNode.js:54:25)
at new XMLBuilder (/.../node_modules/passport-saml/node_modules/xmlbuilder/lib/XMLBuilder.js:27:19)
at Object.module.exports.create (/.../node_modules/passport-saml/node_modules/xmlbuilder/lib/index.js:11:12)
at SAML.generateLogoutRequest (/.../node_modules/passport-saml/lib/passport-saml/saml.js:169:21)
Run Code Online (Sandbox Code Playgroud)
我没有正确地调用这种方法吗?或者我不应该直接调用此方法并调用其他方法吗?
我看到generateLogoutRequest()它指的req.user是我不确定的两个属性:
'saml:NameID' : {
'@Format': req.user.nameIDFormat,
'#text': req.user.nameID
}
Run Code Online (Sandbox Code Playgroud)
如果这些属性不存在,会导致此错误吗?如果是这样,我想我可能需要确保将这些属性添加到从验证回调函数返回的用户对象中?
感谢任何人都可以提供的任何帮助.
我是新来的passport及passport-saml,我试图建立一个Node.js的使用我们的大学对单点登录的Shibboleth标识提供服务器.我非常接近让它全部正常工作,但我在/ login/callback期间遇到了障碍,我认为这与加密配置有关.
我能够将客户端重定向到登录页面,并且在成功登录后,IdP会将POST返回到我的/ login/callback路由.然后我收到这个错误:
Error: Invalid signature at SAML.validatePostResponse (.../node_modules/passport-saml/lib/passport-saml/saml.js:357:21) at Strategy.authenticate (.../node_modules/passport-saml/lib/passport-saml/strategy.js:68:18) at ...etc...
Run Code Online (Sandbox Code Playgroud)
这听起来像我传递给cert配置设置的证书可能不正确?我假设decryptionPvk和cert配置设置应该是我用来创建我的服务器证书的私钥,以及身份提供商的HTTPS证书?或者他们应该是别的什么?
我正在使用最新版本的节点和所有各种模块(快递,护照,护照,saml等)
作为参考,这是我用来测试所有这些的服务器脚本:
"use strict;"
var https = require('https');
var fs = require('fs');
var express = require("express");
var morgan = require('morgan');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var passport = require('passport');
var saml = require('passport-saml');
var cert = fs.readFileSync('./certs/my-server-https-cert.crt', 'utf-8');
var pvk = fs.readFileSync('./certs/my-server-private.key', 'utf-8'); …Run Code Online (Sandbox Code Playgroud)