2009-06-25 54 views
53

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 l'URL? Wsdl. Maintenant j'essaye de tester le service par le client de test de WCF. Il montre les métadonnées appropriées. Mais lorsque je tente d'invoquer une quelconque de la méthode du service, il me montre une exception ... voici les détails Erro avec trace de la pile ..WCFTestClient La requête HTTP n'est pas autorisée avec le schéma d'authentification client 'Anonyme'

La requête HTTP est non autorisée avec système d'authentification client « Anonymous '. L'en-tête d'authentification reçu du serveur était 'Négocier, NTLM'.

trace de pile du serveur:

à
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest demande, la réponse HttpWebResponse, WebException responseException, HttpChannelFactory usine)
La demande HTTP est non autorisé avec le client schéma d'authentification 'Anonyme'. L'en-tête d'authentification reçu de le serveur était 'Négocier, NTLM'.

trace de pile du serveur:

à
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest demande, la réponse HttpWebResponse, WebException responseException, HttpChannelFactory usine)

Liaisons 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> 

Services serveur Section:

<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

OK, merci - mais vous aurez besoin d'afficher également la section du serveur, et la section du client nous allons donc voir comment ces paramètres sont mis en place et comment vous les appeler .... .. –

+0

J'ai aussi posté la section du client de sectiona dn sur la section . – user82613

+0

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

Répondre

9

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

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

J'ai juste eu ce problème sur une machine de développement (la production marche très bien). Je modifie ma configuration dans IIS pour autoriser l'accès anonyme et mettre mon nom et mon mot de passe comme informations d'identification.

Pas la meilleure façon dont je suis sûr, mais cela fonctionne à des fins de test.

6

Je vois cela ne répond pas encore, ceci est une citation exacte from here:

WSHttpBinding va essayer de réaliser une interne à la couche négocier SSP.Pour que cela fonctionne, vous devez autoriser l'accès anonyme dans IIS pour le VDir. WCF va ensuite par défaut perfrom un SPNEGO pour les informations d'identification de la fenêtre. Autoriser l'anonymat sur la couche IIS n'autorise personne, il est reporté dans la pile WCF.

Je trouve cette via: http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html

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

+0

Salut @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 le justifier, à un auditeur? MERCI BEAUCOUP!! Marcelo –

70

Je ne contrôlaient pas la configuration de sécurité pour le service que je l'appelais dans, mais nous avons eu la même erreur. J'ai été en mesure de réparer mon client comme suit.

  1. Dans la configuration, mis en place 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'usurpation d'identité (j'ai ajouté une référence à un client appelé service):

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

Si vous le faites par programme, assurez-vous que vous utilisez la liaison Dim comme New System.ServiceModel.BasicHttpBinding() au lieu de Dim liaison Comme New System.ServiceModel.WSHttpBinding() –

+1

Je ne sais vraiment pas ce qu'est un Customer_PortClient, mais le réglage le mode de sécurité m'a aidé. – Nathan

+0

La partie de sécurité a fait l'affaire pour moi aussi! – nldev

3

Voici ce que j'ai dû faire pour que cela fonctionne. Cela signifie:

  1. sur mesure UserNamePasswordValidator (pas besoin d'un compte Windows, SQL Server ou ActiveDirectory - votre nom d'utilisateur UserNamePasswordValidator pourrait avoir & mot de passe hardcoded, ou lire à partir d'un fichier texte, 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. Allow Anonymous Accès
  2. Activer l'authentification de base
  3. Activer l'authentification Windows intégrée

Seulement "Autoriser l'accès anonyme" est nécessaire (bien que, en soi ne suffisait pas).

Réglage

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

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

Cependant, en utilisant cette liaison a fonctionné:

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

Une autre solution possible à cette erreur que j'ai trouvé. Il se peut qu'il n'ait pas répondu à la question exacte de l'OP, mais qu'il puisse aider d'autres personnes à trébucher sur ce message d'erreur.

je créais mon client dans le code à l'aide WebHttpBinding, afin de reproduire 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 proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

+0

Bon conseil, merci! Aucune idée pourquoi cela a été rejeté. – CompanyDroneFromSector7G

1

Essayez de fournir un nom d'utilisateur et un mot de passe à votre client comme ci-dessous.

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

0

J'ai eu la même erreur aujourd'hui, après le déploiement de notre service appelant un service externe à l'environnement de transfert dans azure. Local le service a appelé le service externe sans erreurs, mais après le déploiement, il n'a pas. En fin de compte, il s'est avéré que le service externe a une validation IP. Le nouvel environnement dans Azure a un autre IP et il a été rejeté.

Donc si jamais vous obtenez cette erreur appelle les services externes

Il pourrait être une restriction IP.

4

J'ai eu un problème similaire et j'ai 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>