SignedXml checksignature gibt false zurück

Ich habe mir andere Beiträge zu diesem Thema angeschaut, und keiner von ihnen scheint sich mit meiner Situation zu befassen.

Ich habe in der letzten Woche versucht, eine SAML-Zusicherung zu überprüfen, und ich habe 2 Clients, die mir SAML gesendet haben, aber ich kann sie nicht überprüfen.

Der Hauptprozess ist, dass wir eine Base64-codierte Behauptung erhalten und ich sie decodiere. Laden Sie es mit PreserveWhitespace = true in ein XmlDocment.

Die Überprüfungsmethode lautet

  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.");
    }

Ich habe das Zertifikat vom Client, das ich aus Web.Config eingelesen habe (die als base64-codierte Zeichenfolge gespeicherte Zeichenfolge

Beide Clients werden von checksignature falsch zurückgegeben, aber wenn ich mit meinem Zertifikat ein eigenes signiertes Saml erstelle, wird es wahr zurückgegeben.

Was fehle ich hier?

EDIT: Ja, beide Clients sind auf Java und ich habe die SetSigningKeyFromKeyInfo-Methode @ geposte

Antworten auf die Frage(6)

Ihre Antwort auf die Frage