Я рассматривал другие сообщения здесь относительно этой проблемы, и ни один из них, похоже, не затрагивает мою ситуацию.SignignXml checksignature возвращает false
Я пытался проверить утверждение SAML за последнюю неделю, и у меня есть 2 клиента, которые отправили мне SAML, но я не могу его проверить.
Основным процессом является получение закодированного байта base64, и я его декодирую. Загрузите его в XmlDocment с помощью PreserveWhitespace = true.
подтверждать метод
public static bool Verify(X509Certificate2 cert, XmlElement xmlElement, SignedXml signedXml)
{
bool flag;
try
{
KeyInfo keyInfo = new KeyInfo();
var clause = new KeyInfoX509Data(cert);
keyInfo.AddClause(clause);
XmlElement signatureElement = GetSignatureElement(xmlElement);
if (signatureElement == null)
{
string message = "The XML does not contain a signature.";
throw new SAMLSignatureException(message);
}
signedXml.LoadXml(signatureElement);
if (keyInfo != null)
{
signedXml.KeyInfo = keyInfo;
}
SetSigningKeyFromKeyInfo(signedXml);
flag = signedXml.CheckSignature(cert.PublicKey.Key);
}
catch (Exception exception)
{
throw new SAMLSignatureException("Failed to verify the XML signature.", exception);
}
return flag;
}
private static void SetSigningKeyFromKeyInfo(SignedXml signedXml)
{
IEnumerator enumerator = signedXml.KeyInfo.GetEnumerator();
while (enumerator.MoveNext())
{
if (enumerator.Current is KeyInfoX509Data)
{
var current = (KeyInfoX509Data) enumerator.Current;
if (current.Certificates.Count != 0)
{
var certificate = (X509Certificate) current.Certificates[0];
var certificate2 = new X509Certificate2(certificate);
AsymmetricAlgorithm key = certificate2.PublicKey.Key;
signedXml.SigningKey = key;
return;
}
}
else
{
if (enumerator.Current is RSAKeyValue)
{
var value2 = (RSAKeyValue) enumerator.Current;
signedXml.SigningKey = value2.Key;
return;
}
if (enumerator.Current is DSAKeyValue)
{
var value3 = (DSAKeyValue) enumerator.Current;
signedXml.SigningKey = value3.Key;
return;
}
}
}
throw new SAMLSignatureException("No signing key could be found in the key info.");
}
Я имею сертификат от клиента, который я прочитал в Web.Config из (его хранится в виде кодированного base64 строка) XmlElement является подписанный элемент, signedXml представляет собой объект, который SignedXml был создан с помощью нового SignedXml (xmlElement)
Оба клиента получают false, возвращенные с помощью контрольной метки, но когда я создаю свой собственный подписанный saml с моим сертификатом, он вернет true.
Что мне здесь не хватает?
EDIT: Да оба клиентов на Java, и я отправил метод SetSigningKeyFromKeyInfo
Позвольте мне угадать, утверждение, которое вы получаете, было сгенерировано на языке нетбуков, например Java? –
Что делает 'SetSigningKeyFromKeyInfo (signedXml);' do? –
Когда у вас есть base64decoded утверждение, можете ли вы выгрузить xml в файл и сравнить его с одним из ваших собственных утверждений, чтобы проверить (тонкие) структурные несоответствия? –