J'essaie de vous connecter à un service Web, écrit en Java, mais je ne peux pas comprendre quelque chose.
Utilisation de la WCF et d'un panneau de panneaux, presque tout semble aller bien, sauf une partie du SOAP Message, car il manque les nœuds de nonce et créé des nœuds de pièces. Il manque évidemment quelque chose, alors si vous pourrait me signaler dans la bonne direction, ce serait très apprécié.
Voici la liaison personnalisée:
<binding name="CustomHTTPBinding">
<security includeTimestamp="false" authenticationMode="UserNameOverTransport" defaultAlgorithmSuite="Basic256" requireDerivedKeys="True"
messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
</security>
<textMessageEncoding maxReadPoolSize="211" maxWritePoolSize="2132" messageVersion="Soap11"
writeEncoding="utf-8"/>
<httpsTransport />
</binding>
Et voici la partie pertinente du message:
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<o:UsernameToken u:Id="uuid-c306efd1-e84c-410e-a2ad-1046b368582e-1">
<o:Username>
<!-- Removed-->
</o:Username>
<o:Password>
<!-- Removed-->
</o:Password>
</o:UsernameToken>
</o:Security>
Et c'est comme ça que ça devrait regarder:
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-25763165">
<wsse:Username>..</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">..</wsse:Password>
<wsse:Nonce>6ApOnLn5Aq9KSH46pzzcZA==</wsse:Nonce>
<wsu:Created>2009-05-13T18:59:23.309Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
La question est donc la suivante: comment pourrais-je introduire la nonce et créer des éléments dans la partie de sécurité?
Créer la nonce, je devais changer quelques points
Tout d'abord, a ajouté une liaison personnalisée dans ma configuration
<system.serviceModel>
<bindings>
<customBinding>
<binding name="myCustomBindingConfig">
<security includeTimestamp="false"
authenticationMode="UserNameOverTransport"
defaultAlgorithmSuite="Basic256"
requireDerivedKeys="true"
messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
</security>
<textMessageEncoding messageVersion="Soap11"></textMessageEncoding>
<httpsTransport maxReceivedMessageSize="2000000000" />
</binding>
</customBinding>
</bindings>
</system.serviceModel>
<client>
<endpoint address="https://..." [other tags]
binding="customBinding" bindingConfiguration="OrangeLeapCustomBindingConfig"/>
</client>
Ensuite, prenez ce code trouvé ici: http://social.msdn.microsoft.com/forums/en-us/wcf/thread/4df3354f-0627-42d9-b5fb-6e880b60f8ee et modifiez-le à Créez la nonce (juste un hachage aléatoire, base-64 codé)
protected override void WriteTokenCore(System.Xml.XmlWriter writer, System.IdentityModel.Tokens.SecurityToken token)
{
Random r = new Random();
string tokennamespace = "o";
DateTime created = DateTime.Now;
string createdStr = created.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
string nonce = Convert.ToBase64String(Encoding.ASCII.GetBytes(SHA1Encrypt(created + r.Next().ToString())));
System.IdentityModel.Tokens.UserNameSecurityToken unToken = (System.IdentityModel.Tokens.UserNameSecurityToken)token;
writer.WriteRaw(String.Format(
"<{0}:UsernameToken u:Id=\"" + token.Id + "\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">" +
"<{0}:Username>" + unToken.UserName + "</{0}:Username>" +
"<{0}:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">" +
unToken.Password + "</{0}:Password>" +
"<{0}:Nonce EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">" +
nonce + "</{0}:Nonce>" +
"<u:Created>" + createdStr + "</u:Created></{0}:UsernameToken>", tokennamespace));
}
protected String ByteArrayToString(byte[] inputArray)
{
StringBuilder output = new StringBuilder("");
for (int i = 0; i < inputArray.Length; i++)
{
output.Append(inputArray[i].ToString("X2"));
}
return output.ToString();
}
protected String SHA1Encrypt(String phrase)
{
UTF8Encoding encoder = new UTF8Encoding();
SHA1CryptoServiceProvider sha1Hasher = new SHA1CryptoServiceProvider();
byte[] hashedDataBytes = sha1Hasher.ComputeHash(encoder.GetBytes(phrase));
return ByteArrayToString(hashedDataBytes);
}
J'ai eu le même problème. Au lieu du sérialisateur de jeton personnalisé, j'ai utilisé un MessageInspector
pour ajouter le correct UsernameToken
dans la méthode BeforeSendRequest
. J'ai ensuite utilisé un comportement personnalisé pour appliquer le correctif.
L'ensemble du processus est documenté (avec A Demo Project ) dans mon article de blog post Soutenir le mot de passe de profil de base WS-I Digest dans un proxy client WCF . Alternativement, vous pouvez simplement lire le [~ # ~] PDF [~ # ~ ~] .
Si vous souhaitez suivre mes progrès à la solution, vous le trouverez sur Stackoverflow intitulé " Erreur dans le service Web consommant Axis 2 Consulting Axis 2 avec WS-Security MotworyDigest Authentication Schéma d'authentification ":
Il convient de souligner que Rick Strahl a fait un message de blog (qu'il fait référence à cette question) où il l'explique tout très clairement et propose des solutions pour un mot de passe seulement et un mot de passeDigest.
Je poste cela parce que j'ai trouvé cet article à l'origine, je ne pouvais pas vraiment le suivre et trouvé la poste de Rick beaucoup plus tard. Cela pourrait sauver certaines personnes un peu de temps.
Cet article fournit un échantillon avec une intégration complète du profil d'utilisateur avec un mot de passe digéré dans le pipeline de sécurité de la WCF.