73 votes

WCFTestClient La demande HTTP n'est pas autorisée avec le schéma d'authentification du client 'Anonyme'.

J'ai créé un service WCF et l'ai déployé sur le serveur. Quand je navigue dans ce service, il me donne une réponse positive avec ?wsdl URL. Maintenant j'essaie de tester le service par le client de test de WCF. Il montre les métadonnées appropriées. Mais quand j'essaie d'invoquer n'importe quelle méthode du service, il me montre une exception... voici les détails de l'erreur avec la trace de pile...

La requête HTTP n'est pas autorisée avec schéma d'authentification du client Anonyme'. L'en-tête d'authentification reçu du serveur est 'Negotiate,NTLM'.

Trace de la pile du serveur :

sur
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest request, HttpWebResponse response, WebException responseException, HttpChannelFactory)
La requête HTTP n'est pas autorisée avec le client. d'authentification du client 'Anonyme'. L'en-tête d'authentification l'en-tête d'authentification reçu du serveur était 'Negotiate,NTLM'.

Trace de la pile du serveur :

sur
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest request, HttpWebResponse response, WebException responseException, HttpChannelFactory)

Liaisons avec le 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 avec le 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 du 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 des 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>

0 votes

Que se passe-t-il lorsque vous appelez ces méthodes avec un vrai client ?

0 votes

OK, merci - mais vous devrez AUSSI poster la section <services> du serveur, et la section <client> du client afin que nous puissions voir comment ces points de terminaison sont configurés et comment vous les appelez.......

0 votes

Avec un client réel, il fonctionne sans aucun problème.

84voto

Alex Peck Points 2986

Je n'avais pas le contrôle de la configuration de sécurité du service auquel je faisais appel, mais j'ai obtenu 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 permettre l'impersonnalisation (j'ai ajouté une référence à un service appelé client) :

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

2 votes

Si vous le faites par programme, assurez-vous d'utiliser Dim binding As New System.ServiceModel.BasicHttpBinding() au lieu de Dim binding As New System.ServiceModel.WSHttpBinding().

2 votes

Je ne sais vraiment pas ce qu'est un Customer_PortClient, mais le fait de définir le mode de sécurité m'a aidé.

3 votes

Lorsque vous utilisez <security mode="TransportCredentialOnly"> il semble qu'il ne soit pas nécessaire d'inclure une configuration pour la sécurité des messages ; le message SOAP est envoyé en clair, en texte brut. Le site <message> La balise semble être ignorée, elle ne fait donc pas de mal, elle n'est simplement pas nécessaire. Source : msdn.microsoft.com/fr/us/library/ff648505.aspx

13voto

RailRhoad Points 1083

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

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

10voto

Wilco Points 91

J'ai trouvé une autre solution possible à cette erreur. Elle n'a peut-être pas répondu à la question exacte de l'OP mais peut aider d'autres personnes qui tombent sur ce message d'erreur.

Je créais mon Client dans le code en utilisant WebHttpBinding, afin de reproduire la ligne suivante :

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

Je devais le faire :

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

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

7voto

Irwin Points 2418

Je vois qu'on n'a pas encore répondu à cette question, c'est une citation exacte. d'ici :

WSHttpBinding va essayer d'effectuer une négociation interne au niveau de la couche SSP. Pour que cela réussisse, vous devrez autoriser l'anonymat dans IIS pour le VDir. WCF va alors par défaut perfromer un SPNEGO pour les informations d'identification de la fenêtre. Permettre anonyme à la couche IIS n'est pas permettre n'importe qui dedans, il déférant à la pile de WCF.

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

Après avoir googlé : http://www.google.tt/#hl=en&source=hp&q=+La+requête+HTTP+n'est+pas+autorisée+avec+le+schéma+d'authentification+du+client+%27Anonyme

0 votes

Bonjour @Irwin, Merci pour la réponse. Pourriez-vous s'il vous plaît fournir une source plus "officielle", comme la documentation originale produite par Microsoft, pour que je puisse justifier cela, à un auditeur ? MERCI BEAUCOUP ! Marcelo

3voto

Jimmy Points 1197

Voici ce que j'ai dû faire pour que ça marche. Cela signifie :

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

Mon site est géré par 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 intégrée de Windows

Seule l'option "Autoriser l'accès anonyme" est nécessaire (bien qu'elle ne soit pas suffisante en soi).

Réglage de

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

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X