2009-05-20 8 views
2

Nous sommes vraiment coincés ici, alors j'ai décidé de demander votre aide.Authentification de demande de service Web

Hier on m'a demandé d'aider à consommer un service Web, a l'URL du WSDL, et les informations d'identification utilisateur à utiliser. Je n'ai jamais vraiment eu affaire à des services web, mais ayant une idée générale à leur sujet et voyant quelques exemples, je pensais que ça ne pouvait pas être si mauvais. Évidemment, j'avais tort car je suis coincé maintenant.

Tout semble bien, la classe proxy (ou client) a été généré, la construction de demandes et de les envoyer sont bien aussi, en dehors de la partie d'authentification. Lequel nous ne pouvons pas sembler comprendre comment faire.

Utilisation du:

client.ChannelFactory.Credentials.UserName.UserName = "myusername"; 
client.ChannelFactory.Credentials.UserName.Password = "mypassword"; 

ne semble pas fonctionner. (Quand je vérifie le BindingElementCollection returbed par le client. Endpoint.Binding.CreateBindingElements() il n'y a aucun SecurityBindingElement)

J'ai essayé tant d'autres manières de le faire, mais je pense que je manque quelque chose de basique et le manque de documentaion n'aide pas vraiment non plus.

La question est: Comment puis-je envoyer le nom d'utilisateur et mot de passe lors d'un appel à un service Web, en utilisant WCF?

Edit: Juste pour clarifier les choses, la demande doit contenir quelque chose de similaire à ceci:

<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>username</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">1DiaGTkOLk/CZhDaEpbkAaKRfGw=</wsse:Password> 
     <wsse:Nonce>6ApOnLn5Aq9KSH46pzzcZA==</wsse:Nonce> 
     <wsu:Created>2009-05-13T18:59:23.309Z</wsu:Created> 
    </wsse:UsernameToken> 
    </wsse:Security> 

Répondre

6

J'ai eu le même problème. Au lieu du serializer jeton personnalisé, j'ai utilisé un MessageInspector pour ajouter le UsernameToken correct dans la méthode BeforeSendRequest. J'ai ensuite utilisé un comportement personnalisé pour appliquer le correctif.

L'ensemble du processus est documenté (avec un demo project) dans mon article de blog Supporting the WS-I Basic Profile Password Digest in a WCF client proxy. Alternativement, vous pouvez simplement lire le PDF.

Si vous voulez suivre mes progrès grâce à la solution, vous trouverez sur StackOverflow intitulé, « Error in WCF client consuming Axis 2 web service with WS-Security UsernameToken PasswordDigest authentication scheme »:

+1

Cheers, j'aimerais le savoir il y a deux ans :) –

1

J'ai réalisé similaire, en utilisant une HttpCookie régulière.

Pour créer le cookie:

[OperationContract]  
public void LoginToApi(string username, string password, string clientName) 
{ 
// authenticate with DB, if successful ... 
// construct a cookie 
    HttpCookie httpCookie = new HttpCookie("SessionID","whateverneeded"); 
    HttpContext.Current.Response.SetCookie(httpCookie); 
} 

Cela apparaît dans vos HttpRequests réguliers, aussi. Donc, vous venez d'inverser le processus, en vérifiant le hash/session ID/nom d'utilisateur/mot de passe tout ce que vous mettez dans le cookie à la réception avant de faire quoi que ce soit.

+0

Je dois ajouter que j'utilisé cette méthode parce que je voulais utiliser le même cookie comme le principal site Internet. –

+0

Merci, je ne sais pas si ça me rapproche. –

1
var factory = new ChannelFactory<IService>('*'); 
factory.Credentials.UserName.UserName = 'bob'; 
factory.Credentials.UserName.Password = 'bob'; 
var proxy = factory.CreateChannel(); 

Pour plus d'informations, vous pouvez explorer l'autorisation Dans les services WCF-Based * (http ://msdn.microsoft.com/en-us/magazine/cc948343.aspx) *

+0

Cet article semble parler de services basés sur WCF seulement. J'ai rapidement essayé votre suggestion et je reçois toujours une exception "No WS-Security header found". –

Questions connexes