Connectez-vous avec WCF à une authentification de service Web avec nom d'utilisateur / mot de passe

StackOverflow https://stackoverflow.com/questions/806007

Question

J'ai créé le proxy d'un service Web avec Visual Studio 2008, qui m'a créé l'entrée suivante dans le fichier app.config:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="MyNameHandlerSoapBinding" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://www.***/***/***"
              binding="basicHttpBinding" bindingConfiguration="MyNameHandlerSoapBinding"
              contract="***.MyNameHandler" name="MyName">
          </endpoint>
        </client>
    </system.serviceModel>

Le service Web possède une authentification nom d'utilisateur / mot de passe, je dois donc l'ajouter quelque part ici.

Je suis un peu perdu dans la mer de la documentation WCF. Je pense que je dois passer de basicHttpBinding à wsHttpBinding ou customBinding pour pouvoir ajouter les éléments d'authentification, mais je ne le comprends pas vraiment. Quelqu'un pourrait-il donner un conseil rapide ou un lien utile expliquant comment procéder?

EDIT:

J'ai modifié la section de sécurité en:

<security mode="Transport">
    <transport clientCredentialType="Basic" proxyCredentialType="None"
         realm="" />
</security>

et ajouté dans le code:

ws.ClientCredentials.UserName.UserName = "";
ws.ClientCredentials.UserName.Password = "";

Maintenant, il semble que les informations d'identification soient utilisées, mais cela me donne l'erreur:

le schéma d'URI fourni "http" est l'URI non valide attendu "https"

Je ne sais même pas si c'est la bonne façon de faire ...

Était-ce utile?

La solution

Je poste ici la solution pour les futurs lecteurs:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="MyHandlerSoapBinding" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic"  />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://www.***/***/***/MyHandler"
          binding="basicHttpBinding" bindingConfiguration="MyHandlerSoapBinding"
          contract="***.MyHandler" name="MyHandler">
      </endpoint>

    </client>
  </system.serviceModel>

En fin de compte, je pourrais utiliser le basicHttpBinding par défaut. La seule différence par rapport au code affiché dans la question est le nœud de sécurité .

Notez également l'option mode = "TransportCredentialOnly" , qui vous permet d'envoyer un nom d'utilisateur / mot de passe à l'aide de http au lieu de https . Ceci est nécessaire pour tester les environnements comme celui que j'utilise. Plus tard, évidemment, vous préférerez que https envoie vos informations d'identification.

Ensuite, entrez votre nom d'utilisateur / mot de passe dans le code:

var ws = new ***.MyHandlerClient("MyHandler");
ws.ClientCredentials.UserName.UserName = "myUsername";
ws.ClientCredentials.UserName.Password = "myPassword";
var result = ws.executeMyMethod();

Autres conseils

Le message d'erreur est correct. WCF n'autorisera pas le transport de noms d'utilisateur et de mots de passe via un protocole non protégé. Votre service Web doit utiliser HTTPS (avec le certificat SSL standard)

Une fois que vous avez un certificat SSL, vous avez deux options sur la manière dont les informations d'identification sont envoyées, le transport ou la sécurité et de multiples options pour le type d'informations d'identification. MSDN propose un guide de toutes les options.

J'ai eu le même problème et j'ai essayé la solution ci-dessus D'une certaine manière cela n'a pas fonctionné pour moi Je continuais à recevoir le message "Aucun en-tête WS-Security trouvé"

Après une longue période de tests et d’essais, j’arrive à le faire fonctionner. J'ai ajouté le code d'en-tête dans le client comme ci-dessous, puis ça marche!

<client>
    <endpoint address="http://your.service.com" binding="basicHttpBinding" bindingConfiguration="XXXBinding" contract="contract.XXX" name="XXXPort">
        <headers xmlns:wsse="http://your.xsd">
            <wsse:Security mustUnderstand="1">
                <wsse:UsernameToken>
                    <tenant>XXX</tenant>
                    <wsse:Username>XXX</wsse:Username>
                    <wsse:Password Type="http://www.xxxx.com/wss#PasswordText">XXX</wsse:Password>
                </wsse:UsernameToken>
            </wsse:Security>
        </headers>
    </endpoint>
</client>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top