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.
Vous êtes un homme rock, je cherchais des informations sur la façon de fonctionner correctement! – JCleveland
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