Ich habe andere Beiträge hier in Bezug auf dieses Problem angeschaut und keine von ihnen scheint meine Situation anzusprechen.SignedXml checksignature gibt false zurück
Ich habe versucht, eine SAML-Assertion für die letzte Woche zu überprüfen, und ich habe 2 Clients, die mir SAML gesendet haben, aber ich kann es nicht überprüfen.
Der Hauptprozess ist eine Base64 codierte Behauptung und ich entziffere sie. Laden Sie es in ein XmlDocment mit PreserveWhitespace = true.
die Verifizierungsmethode ist
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.");
}
I das Zertifikat von dem Client, die ich in von Web.Config gelesen (als seine gespeicherten Base64 codierten String) XMLELEMENT ist das unterzeichnete Element ist SignedXml ein Objekt, das SignedXml wurde mit neuen SignedXml (xmlElement)
erstellt Beide Clients erhalten falsche von Checksignature zurückgegeben, aber wenn ich meine eigene signierte saml mit meinem Zertifikat erstellen, wird True zurückgegeben.
Was fehlt mir hier?
EDIT: Ja beide der Kunden sind auf Java und ich fuhr die SetSigningKeyFromKeyInfo Methode
Lassen Sie mich raten, die Behauptung, die Sie erhalten, wurde in einer Nicht-Sprache, wie Java, generiert? –
Was macht 'SetSigningKeyFromKeyInfo (signedXml);'? –
Wenn Sie die Assertion mit Base64 dekodieren, können Sie das XML in eine Datei speichern und es mit einer Ihrer eigenen Assertionen vergleichen, um nach (subtilen) strukturellen Inkonsistenzen zu suchen? –