web-dev-qa-db-fra.com

WCFTestClient La requête HTTP n'est pas autorisée avec le schéma d'authentification client 'Anonyme'

J'ai créé un service WCF et l'ai déployé sur le serveur. Lorsque je navigue sur ce service, il me donne une réponse positive avec? Wsdl URL. Maintenant, j'essaie de tester le service via le client de test WCF. Il montre les métadonnées appropriées. Mais lorsque j'essaie d'invoquer l'une des méthodes du service, une exception se présente. Voici les détails de erro avec trace de pile.

La requête HTTP est non autorisée avec schéma d'authentification client 'Anonyme'. L'en-tête d'authentification reçu du serveur était «Négocier, NTLM».

Trace de la pile du serveur: 

à
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (Requête HttpWebRequest , Réponse HttpWebResponse, WebException responseException, HttpChannelFactory).
La requête HTTP n'est pas autorisée avec le client schéma d'authentification 'Anonymous'. Le en-tête d'authentification reçu de le serveur était 'Negotiate, NTLM'.

Trace de la pile du serveur: 

à
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (Requête HttpWebRequest , Réponse HttpWebResponse, WebException responseException, HttpChannelFactory).

Reliures client:

<bindings>
    <wsHttpBinding>
        <binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
            allowCookies="false">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <reliableSession ordered="true" inactivityTimeout="00:10:00"
                enabled="false" />
            <security mode="None">
                <transport clientCredentialType="Windows" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="Windows" negotiateServiceCredential="true"
                    establishSecurityContext="true" />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

Liaisons serveur:

<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="None">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />
      </security>
    </binding>
    <binding name="WSHttpServiceMagicBinding" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000"/>
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
      <security mode="None">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
        <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

Section client du client:

<client>
    <endpoint address="http://hydwebd02.solutions.com/GeoService.Saveology.com/ServiceMagicService.svc"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceMagicService"
        contract="IServiceMagicService" name="WSHttpBinding_IServiceMagicService" />
</client>

Section Services du serveur:

<services>
    <service behaviorConfiguration="GeoService.Saveology.com.CityStateServiceProviderBehavior"
    name="GeoService.Saveology.com.CityStateServiceProvider">
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_SEOService"
        contract="SEO.Common.ServiceContract.ICityStateService" />
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
        contract="IMetadataExchange" />
    </service>
    <service behaviorConfiguration="GeoService.Saveology.com.ServiceMagicServiceProviderBehavior"
    name="GeoService.Saveology.com.ServiceMagicServiceProvider">
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpServiceMagicBinding" 
        contract="SEO.Common.ServiceContract.IServiceMagicService">
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
    </service>
</services>
57
user82613

Je n'avais pas le contrôle de la configuration de sécurité du service auquel j'appelais, mais j'ai eu la même erreur. J'ai pu réparer mon client comme suit.

  1. Dans la configuration, configurez le mode de sécurité:

    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
    
  2. Dans le code, définissez la classe proxy pour autoriser l'emprunt d'identité (j'ai ajouté une référence à un service appelé customer):

    Customer_PortClient proxy = new Customer_PortClient();
    proxy.ClientCredentials.Windows.AllowedImpersonationLevel =    
             System.Security.Principal.TokenImpersonationLevel.Impersonation;
    
78
Alex Peck

J'ai un problème similaire, avez-vous essayé:

proxy.ClientCredentials.Windows.AllowedImpersonationLevel =   
          System.Security.Principal.TokenImpersonationLevel.Impersonation;
9
RailRhoad

Je vois que ce n'est pas encore répondu, ceci est une citation exacte à partir d'ici :

WSHttpBinding tentera d'effectuer une négociation interne au niveau de la couche SSP. Pour que cela réussisse, vous devez autoriser l'anonymat dans IIS pour le VDir. WCF procèdera ensuite par défaut à un SPNEGO pour les informations d'identification de la fenêtre. Autoriser l'anonymat sur la couche IIS ne permet à personne d'entrer, mais reporte à la pile WCF.

J'ai trouvé cela via: http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html

Après la recherche sur Google: http://www.google.tt/#hl=fr&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous

6
Irwin

Une autre solution possible à cette erreur que j'ai trouvée. N'aurait peut-être pas répondu à la question exacte de OP mais pourrait aider d'autres personnes qui tombent sur ce message d'erreur.

Je créais mon client en code avec WebHttpBinding, afin de répliquer la ligne suivante:

<security mode="TransportCredentialOnly">
  <transport clientCredentialType="Windows" proxyCredentialType="Windows" />
</security>

Je devais faire:

var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly);
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
                binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Windows;

ainsi que la mise en proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

5
Wilco

J'ai eu un problème similaire et essayé tout ce qui est suggéré ci-dessus. Puis j'ai essayé de changer le clientCreditialType en Basic et tout a bien fonctionné.

<basicHttpBinding>
    <binding name="BINDINGNAMEGOESHERE" >
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Basic"></transport>
      </security>
    </binding>
  </basicHttpBinding>
4
PunkTurnet

Voici ce que je devais faire pour que cela fonctionne. Ça signifie:

  1. Custom UserNamePasswordValidator (inutile de créer un compte Windows, SQLServer ou ActiveDirectory - votre nom d'utilisateur (UserNamePasswordValidator peut avoir un nom d'utilisateur et un mot de passe codés en dur), ou les lire à partir d'un fichier texte, MySQL ou autre.
  2. https
  3. IIS7
  4. .net 4.0

Mon site est géré via DotNetPanel. Il dispose de 3 options de sécurité pour les répertoires virtuels: 

  1. Autoriser l'accès anonyme 
  2. Activer l'authentification de base 
  3. Activer l'authentification Windows intégrée

Seul "Autoriser l'accès anonyme" est nécessaire (bien que cela ne soit pas suffisant en soi).

Réglage

proxy.ClientCredentials.Windows.AllowedImpersonationLevel =  System.Security.Principal.TokenImpersonationLevel.Impersonation;

N'a pas fait de différence dans mon cas.

Cependant, l'utilisation de cette liaison a fonctionné:

      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Windows" />
        <message clientCredentialType="UserName" />
      </security>        
3
Jimmy

Essayez de fournir le nom d'utilisateur et le mot de passe dans votre client comme ci-dessous

client.ClientCredentials.UserName.UserName = @ "Domaine\nom d'utilisateur"; client.ClientCredentials.UserName.Password = "mot de passe";

1
user2659865

Je viens d'avoir ce problème sur une machine de développement (la production fonctionne très bien). Je modifie ma configuration dans IIS pour autoriser l'accès anonyme et mets mon nom et mon mot de passe comme identifiants. 

Je ne suis pas sûr que ce soit le meilleur moyen, mais cela fonctionne à des fins de test.

0
David Brunelle

J'ai eu la même erreur aujourd'hui, après avoir déployé notre service en appelant un service externe dans l'environnement de transfert dans Azure. Local, le service a appelé le service externe sans erreur, mais pas après le déploiement.

En fin de compte, il s'est avéré que le service externe dispose d'une validation IP. Le nouvel environnement Azure a une autre adresse IP et celle-ci a été rejetée.

Donc, si jamais vous obtenez cette erreur en appelant des services externes

Cela pourrait être une restriction IP.

0
rfcdejong