Привет! В настоящее время я использую Passport / SAML / ADFS для аутентификации пользователей при входе на мой сайт.В настоящее время он работает, и в него могут входить только те пользователи, которые вводят правильные имена пользователей и пароли для входа в Active Directory.
В настоящее время я пытаюсь найти способ ввода имени пользователя, введенного пользователем при входе в систему.затем сравнить сайт со списком имен пользователей на роль пользователя.
Моей конечной целью было бы добиться того, чтобы сайт функционировал точно так же, как сейчас, но чтобы можно было видеть имя пользователя и сравнивать его сSQL вернул набор значений.
Конфигурация приведена ниже, и любая помощь будет принята с благодарностью.Я все еще очень новичок в выражении / angular / SAML, поэтому я создал эту настройку, просто следуя инструкциям в Интернете.
config / config.js
module.exports = {
development: {
app: {
name: 'Passport SAML strategy example',
port: process.env.PORT || 80
},
passport: {
strategy: 'saml',
saml: {
callbackUrl: process.env.SAML_CALLBACK_URL || 'https://exa.example.com',
entryPoint: process.env.SAML_ENTRY_POINT || 'https://sts.example.net/adfs/ls/idpinitiatedsignon',
issuer: process.env.SAML_ISSUER || 'https://exa.example.com',
identifierFormat: null,
signatureAlgorithm: 'sha256',
authnContext: 'http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/windows',
disableRequestedAuthnContext: true
//cert: process.env.SAML_CERT || null
}
}
}
};
config / passport.js
const SamlStrategy = require('passport-saml').Strategy;
module.exports = function (passport, config) {
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function (user, done) {
done(null, user);
});
passport.use(new SamlStrategy(
{
callbackUrl: config.passport.saml.callbackUrl,
entryPoint: config.passport.saml.entryPoint,
issuer: config.passport.saml.issuer,
cert: config.passport.saml.cert,
identifierFormat: config.passport.saml.identifierFormat,
signatureAlgorithm: config.passport.saml.signatureAlgorithm,
authnContext: config.passport.saml.authnContext,
disableRequestedAuthnContext: config.passport.saml.disableRequestedAuthnContext
},
function (profile, done) {
return done(null,
{
upn: profile['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'],
}
);
}
)
);
};
config / rout.js
var xmldoc = require('xmldoc');
module.exports = function (app, config, passport) {
app.get('/', function (req, res) {
res.redirect('/home')
});
app.get('/login',
passport.authenticate(config.passport.strategy,
{
successRedirect: '/',
failureRedirect: '/login'
})
);
app.post('/', function(req, res) {
console.log('body saml:', req.body.SAMLResponse);
const body = req.body.SAMLResponse;
var b = new Buffer(body, 'base64');
let text = b.toString('ascii');
console.log('formmatted saml',text);
var document = new xmldoc.XmlDocument(text);
var status = document.descendantWithPath("samlp:Status").firstChild.attr;
console.log("status id:", status['Value']);
if( status['Value'] === 'urn:oasis:names:tc:SAML:2.0:status:Success' || status['Value'] === 'urn:oasis:names:tc:SAML:2.0:status:Responder'){
req.session.username = 'user'+Math.floor(Math.random() * Math.floor(10000000));
console.log("initialize session:", req.session.username);
}
else{
req.session.username = '';
}
res.redirect('/home');
}
);
app.get('/logout', function (req, res) {
req.logout();
res.redirect('https://sts.example.net/adfs/ls/?wa=signout1.0');
});
};
express / server.js
const express = require('express');
const http = require('http');
const path = require('path');
const passport = require('passport');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const request = require('request');
const session = require('express-session');
const errorhandler = require('errorhandler');
var env = process.env.NODE_ENV || 'development';
const config = require('./config/config')[env];
console.log('Using configuration', config);
require('./config/passport')(passport, config);
var app = express();
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(session(
{
resave: true,
saveUninitialized: true,
cookieName: 'session',
secret: 'random_string_goes_here',
duration: 15 ,
activeDuration: 15,
maxAge: 30
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(morgan('combined'));
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS,DELETE,PUT');
res.setHeader('Access-Control-Allow-Credentials', true);
next();
});
app.set('port', config.app.port);
require('./config/routes')(app, config, passport);
function ensureAuthenticated(req, res, next) {
console.log("passing the user val" + req.session.username)
if( req.session.username){
return next();
}
else{
res.redirect('/login');
}
}
app.use(express.static(path.join(__dirname, 'public')));
app.get('/*', ensureAuthenticated, (req, res) => {
res.sendFile(path.join(__dirname, 'public/index.html'));
});
app.listen(app.get('port'), function () {
console.log('Express server listening on port ' + app.get('port'));
});