2016-04-10 5 views
0

Я hava приложение meteor, работающее на сервере Windows 2012 r2 с iis 8.5 как обратный прокси для моего приложения (также проверено на ubuntu с nginx), и я пытаюсь выполнить аутентификацию с помощью ADFS 2.0 с помощью saml.У SAML сообщение имеет неправильную подпись

я получаю следующее сообщение об ошибке:

Event 303, AD FS 2.0 
The Federation Service encountered an error while processing the SAML authentication request. 

Additional Data 
Exception details: 
MicrosoftidentityModel.Protocols.XmISignature.SignatureVerificationFailedException: M5I50038: SAML Message has wrong signature. Issuer: 
at MicrosoftldentityServer.Protocols.Saml.Contract.SamIContractUtility,CreateSamIMessage(MSISSamlBindingMessage message) 
at Microsoft.IdentityServer.Service.Sam1Protocol.Sam1ProtocolService.CreateErrorMessage(CreateErrorMe.ssageRequest 
createErrorMessageRequest)r 
at Microsoft.IdentityServer.Service.Sam1Protocol.SarnIProtocolService.ProcessRequest(Message requestMessage) 
Log Name: 
AD FS 2.0/Admin 
Source: 
AD FS 2.0 
Logged: 
10/04/2016 09:0S:1 
Event ID: 
303 
Task Category: 
None 
Level: 
Error 
Keywords: 
AD F 
User: 
NETWORK SERVICE 
Computer: 

Я попытался установить kb2896713 согласно https://social.technet.microsoft.com/Forums/en-US/4acc04b7-aac7-43e9-ba50-9570503045f9/msis0038-saml-message-has-wrong-signature?forum=windowsazureaditpro

несчастливо, не повезло до сих пор.

У кого-то есть идеи? В чем причина проблемы?

EDIT

это является открытым исходным кодом я использую: Rocket.Chat https://github.com/RocketChat/Rocket.Chat/tree/develop/packages/meteor-accounts-saml

+1

У вас есть какой-либо код, используемый для аутентификации таким образом? Если да, предоставьте [mcve]. –

ответ

0
  1. Я хотел бы предложить, чтобы сгенерировать сертификат, ключ с помощью этого инструмента https://www.samltool.com/self_signed_certs.php
  2. Вы можете подтвердить свой запрос с подписью здесь https://www.samltool.com/validate_logout_req.php
  3. Инструмент для кодирования/декодирования URL-адреса http://meyerweb.com/eric/tools/dencoder/
  4. Установите SAML трассировщик, чтобы увидеть SAML запрос/ответ на Firefox https://addons.mozilla.org/ru/firefox/addon/saml-tracer/
  5. Инструмент для декодирования/кодирования сообщений SAML https://rnd.feide.no/simplesaml/module.php/saml2debug/debug.php

SAML.prototype.requestToUrl = функция (запрос, операции, обратный вызов) {

console.log("requestToUrl:"); 
request = request.replace(/(\r\n|\n|\r)/gm,""); 
console.log("Logout request:" + request); 

var self = this; 
var result; 
zlib.deflateRaw(request, function (err, buffer) { 
if (err) { 
    return callback(err); 
} 

var base64 = buffer.toString('base64'); 
var target = self.options.entryPoint; 

if (operation === 'logout') { 
    if (self.options.idpSLORedirectURL) { 
    target = self.options.idpSLORedirectURL; 
    } 
} 

if (target.indexOf('?') > 0) 
    target += '&'; 
else 
    target += '?'; 

var samlRequest = { 
    SAMLRequest: base64 
}; 

var relayState; 

// TBD. We should really include a proper RelayState here 
if (operation === 'logout') { 
    relayState = self.options.issuer; 
} else { 
    relayState = self.options.provider; 
} 

// URL Encode the bytes 
var encodedRequest = encodeURIComponent(base64); 
console.log("encodedRequest:"+encodedRequest); 
var encodedRelayState = encodeURIComponent(relayState); 
var finalSignatureValue = ""; 

var encodedSigAlg = encodeURIComponent("http://www.w3.org/2000/09/xmldsig#rsa-sha1"); 
var strSignature = "SAMLRequest=" + encodedRequest.replace(/(\r\n|\n|\r)/gm,""); 
strSignature += "&RelayState=" + encodedRelayState; 
strSignature += "&SigAlg=" + encodedSigAlg; 

var signer = crypto.createSign('RSA-SHA1'); 
signer.update(strSignature); 
var signature = signer.sign(self.options.privateKey, 'base64'); 
console.log("signature:" + signature); 

var b = new Buffer(signature); 
var s = b.toString('base64'); 
var encodedSignature = encodeURIComponent(signature); 
console.log("encodedSignature:" + encodedSignature); 

var finalSignatureValue = "&SigAlg=" + encodedSigAlg + "&Signature=" + encodedSignature; 

target += "SAMLRequest=" + encodedRequest.replace(/(\r\n|\n|\r)/gm,""); 
target +="&RelayState=" + encodedRelayState; 
target += finalSignatureValue; 


if (Meteor.settings.debug) { 
    console.log("requestToUrl: " + target); 
} 
if (operation === 'logout') { 
    // in case of logout we want to be redirected back to the Meteor app. 
    result = target; 
    return callback(null, target); 

} else { 
    callback(null, target); 
} 
}); 

Смежные вопросы