2010-11-16 15 views
2

J'ai travaillé sur un service WCF qui retournera une chaîne codée Base64 qui est, en réalité, un document XML de réponse SAML complète. Parce que cette information sera transmise à un fournisseur, je dois répondre à leurs exigences quant à la façon dont le document SAML ressemblera et sera encodé. J'ai de la difficulté à obtenir une sortie qui répond à leurs besoins.Comment faire pour utiliser WIF RSA15 lors du cryptage de données à l'aide d'un certificat?

Je sais WCF et WIF ensemble devraient m'aider. J'ai initialement construit le service en utilisant WIF pour créer les assertions SAML (token) et d'autres codes C# pour générer le document SAML final. Tout cela fonctionne et répond aux exigences du fournisseur à l'exception du nœud <EncryptedData> du document. Cette section utilise AES256 et RSAOAEP mais le fournisseur veut AES128 et RSA15. Ainsi, je cherche une solution. Toute aide serait grandement appréciée.

Voici une promenade à travers.

Le service reçoit un GUID qui est utilisé pour appeler la base de données et renvoyer des champs. Ceux-ci sont ensuite utilisés comme ceci:

DataTable userData = GetDataForUser(userId); 
List<Claim> claims = new List<Claim>() 
{ 
    new Claim("ClientId", "NameOfClient") 
}; 
foreach (DataRow row in userData.Rows) 
{ 
    string memberId = row["MemberId"].ToString().Trim(); 
    string firstName = row["FirstName"].ToString().Trim(); 
    string lastName = row["LastName"].ToString().Trim(); 
    DateTime dob = Convert.ToDateTime(row["DateOfBirth"], CultureInfo.InvariantCulture); 

    claims.Add(new Claim("MemberId", memberId)); 
    claims.Add(new Claim("FirstName", firstName)); 
    claims.Add(new Claim("LastName", lastName)); 
    claims.Add(new Claim("DOB", dob.ToString("MM/dd/yyyy"))); 
} 

return claims; 

je puis créer un SecurityTokenDescriptor comme ceci:

SecurityTokenDescriptor descriptor = new SecurityTokenDescriptor(); 

Les demandes sont ajoutées au descripteur comme ceci:

descriptor.Subject = new ClaimsIdentity(claims); 

Le descripteur est chargé pour crypter le jeton comme ceci:

descriptor.EncryptingCredentials = GetEncryptingCredentials(); 

et la routine ressemble GetEncryptingCredentials(): ce

private EncryptedKeyEncryptingCredentials GetEncryptingCredentials() 
{ 
    // Get the Encrypting Certificate 
    X509Certificate2 encryptCert = CertificateHelper.FindSingleCertificate(StoreName.TrustedPeople, StoreLocation.LocalMachine, X509FindType.FindBySubjectDistinguishedName, "<<certificate stuff here >>", true); 

    EncryptedKeyEncryptingCredentials encryptingCreds = new EncryptedKeyEncryptingCredentials(encryptCert); 

    return encryptingCreds; 
} 

Tout cela génère un jeton qui, lorsqu'il est écrit dans un fichier me donne ceci:

<EncryptedAssertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> 
    <xenc:EncryptedData Id="_16584ace-9f3e-4352-9fc9-f6db8b2e925c" Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> 
     <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> 
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <e:EncryptedKey xmlns:e="http://www.w3.org/2001/04/xmlenc#"> 
      <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"> 
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
      </e:EncryptionMethod> 
      <KeyInfo> 
      <o:SecurityTokenReference xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
       <X509Data> 
       <X509IssuerSerial> 
        <X509IssuerName><!-- value --></X509IssuerName> 
        <X509SerialNumber><!-- value --></X509SerialNumber> 
       </X509IssuerSerial> 
       </X509Data> 
      </o:SecurityTokenReference> 
      </KeyInfo> 
      <e:CipherData> 
      <e:CipherValue><!-- value -->CipherValue> 
      </e:CipherData> 
     </e:EncryptedKey> 
     </KeyInfo> 
     <xenc:CipherData><xenc:CipherValue><!-- value --></xenc:CipherValue> 
     </xenc:CipherData> 
    </xenc:EncryptedData> 
    </EncryptedAssertion> 

Grand, droit? Nan. Le vendeur a besoin de l'<EncryptedData> section pour avoir le nœud enfant suivant:

<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/> 

Et ils ont besoin de la section InfoClé < > <EncryptedKey> montrer ceci:

<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/> 

J'ai essayé toutes les combinaisons que je peut penser à dans la routine GetEncryptingCredentials(). Rien n'a produit les résultats souhaités. Le message d'erreur le plus prometteur Je reçois ressemble à ceci:

ID4178: Les EncryptingCredentials fournies dans le SecurityTokenDescriptor est une clé asymétrique. Vous devez utiliser un EncryptedKeyEncryptingCredentials pour crypter le jeton.

Quelqu'un a une suggestion? N'ayez pas peur de me dire de tout recommencer. C'est d'accord. J'ai juste besoin de faire fonctionner ça.

Merci d'avance.

Répondre

6

J'ai trouvé une solution qui fonctionne. Au moins, il génère le XML comme j'en ai besoin et le vendeur a dit qu'ils sont capables d'utiliser ce que je leur envoie.

J'ai réécrit la routine GetEncryptingCredentials() légèrement. Il ressemble maintenant à ceci:

private EncryptingCredentials GetEncryptingCredentials() 
{ 
    string keyWrapAlgorithm = SecurityAlgorithms.RsaV15KeyWrap; //"http://www.w3.org/2001/04/xmlenc#aes256-cbc"; 
    string encryptionAlgorithm = SecurityAlgorithms.Aes128Encryption; //"http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"; 
    int keySize = 128; 

    X509Certificate2 encryptCert = CertificateHelper.FindSingleCertificate(StoreName.TrustedPeople, StoreLocation.LocalMachine, X509FindType.FindBySubjectDistinguishedName, _settings.EncryptingCredentials, true); 

    EncryptingCredentials encryptingCredentials = new EncryptedKeyEncryptingCredentials(encryptCert, keyWrapAlgorithm, keySize, encryptionAlgorithm); 

    return encryptingCredentials; 
} 

Je pensais que je laisserais tout le monde savoir et fermer la boucle sur ce point.

+0

Vous êtes un homme rock, je cherchais des informations sur la façon de fonctionner correctement! – JCleveland

+0

Ce post est très vieux, pas sûr si vous vous en souviendrez! Haha! Mais la section X509Data sous KeyInfo ne devrait-elle pas inclure aussi le X509Certificate? – Naner