Search code examples
c#.netsaml-2.0x509certificate2aescryptoserviceprovider

How to Decrypt EncryptedAssertion using System.Cryptography


The Identity provider is encrypting the Saml Assertion using the functions of component pro

Dim encryptedSamlAssertion As New EncryptedAssertion(samlAssertion, encryptingCert, New System.Security.Cryptography.Xml.EncryptionMethod(SamlKeyAlgorithm.Aes256Cbc))

At the Service Provider I am trying to Decrypt the assertion. But I cannot use component pro. I have to use System.Security.Cryptography

  • X509Certificate is used for encrypting and decryption
  • Aes256Cbc is the Encryption Algorithm

Please help in providing me some more information on how can I achieve Decryption of SamlAssertions using X509Certificate and Aes256Cbc Algorithm


Solution

  • private class Saml2SSOSecurityTokenResolver : SecurityTokenResolver
    {
        List<SecurityToken> _tokens;
    
        public Saml2SSOSecurityTokenResolver(List<SecurityToken> tokens)
        {
            _tokens = tokens;
        }
        protected override bool TryResolveSecurityKeyCore(System.IdentityModel.Tokens.SecurityKeyIdentifierClause keyIdentifierClause, out System.IdentityModel.Tokens.SecurityKey key)
        {
            var token = _tokens[0] as X509SecurityToken;
    
            var myCert = token.Certificate;
    
            key = null;
    
            var ekec = keyIdentifierClause as EncryptedKeyIdentifierClause;
    
            if (ekec != null)
            {
                if (ekec.EncryptionMethod == "http://www.w3.org/2001/04/xmlenc#rsa-1_5")
                {
                    var encKey = ekec.GetEncryptedKey();
                    var rsa = myCert.PrivateKey as RSACryptoServiceProvider;
                    var decKey = rsa.Decrypt(encKey, false);
                    key = new InMemorySymmetricSecurityKey(decKey);
                    return true;
                }
    
                var data = ekec.GetEncryptedKey();
                var id = ekec.EncryptingKeyIdentifier;
            }
    
            return true;
        }
    
        protected override bool TryResolveTokenCore(System.IdentityModel.Tokens.SecurityKeyIdentifierClause keyIdentifierClause, out System.IdentityModel.Tokens.SecurityToken token)
        {
            throw new NotImplementedException();
        }
    
        protected override bool TryResolveTokenCore(System.IdentityModel.Tokens.SecurityKeyIdentifier keyIdentifier, out System.IdentityModel.Tokens.SecurityToken token)
        {
            throw new NotImplementedException();
        }
    }