Erreur WCF: l'appelant n'a pas été authentifié par le service
j'essaie d'accéder à mon service WCF sur un serveur à partir de mon application client console pour tester. J'obtiens l'erreur suivante:
L'appelant n'a pas été authentifié par le service
j'utilise wsHttpBinding
. Je ne suis pas sûr du type d'authentification que le service attend?
<behaviors>
<serviceBehaviors>
<behavior name="MyTrakerService.MyTrakerServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
mise à Jour
Cela fonctionne si je change ma reliure à <endpoint "basicHttpBinding" ... />
(à partir de wsHttpBinding)
sur le serveur IIS 7.0, windows 2008 server
11 réponses
si vous utilisez basicHttpBinding, configurez le paramètre de sécurité à "None "et transportez clientCredintialType à" None."
<bindings>
<basicHttpBinding>
<binding name="MyBasicHttpBinding">
<security mode="None">
<transport clientCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyService">
<endpoint
binding="basicHttpBinding"
bindingConfiguration="MyBasicHttpBinding"
name="basicEndPoint"
contract="IMyService"
/>
</service>
en outre, assurez - vous que les méthodes d'authentification de répertoire dans IIS pour permettre L'accès anonyme
je l'ai eu.
si vous voulez utiliser wshttpbinding, vous devez ajouter les identifiants de windows comme ci-dessous.
svc.ClientCredentials.Windows.ClientCredential.UserName = "abc";
svc.ClientCredentials.Windows.ClientCredential.Password = "xxx";
merci
avez-vous essayé d'utiliser basicHttpBinding au lieu de wsHttpBinding? Si vous n'avez pas besoin d'authentification et que les implémentations Ws-* ne sont pas nécessaires, vous seriez probablement mieux avec une simple reliure basicHttpBinding. WsHttpBinding implémente WS-Security pour la sécurité et l'authentification des messages.
définir l'accès anonyme dans votre répertoire virtuel
écrire les informations d'identification suivantes à votre service
ADTService.ServiceClient adtService = new ADTService.ServiceClient();
adtService.ClientCredentials.Windows.ClientCredential.UserName="windowsuseraccountname";
adtService.ClientCredentials.Windows.ClientCredential.Password="windowsuseraccountpassword";
adtService.ClientCredentials.Windows.ClientCredential.Domain="windowspcname";
après cela vous appelez vos méthodes de webservice.
si vous utilisez un site auto-hébergé comme moi, la façon d'éviter ce problème (tel que décrit ci-dessus) est de stipuler à la fois du côté hôte et du côté client que le mode de sécurité wsHttpBinding = NONE.
Lors de la création de la liaison, à la fois sur le client et l'hôte, vous pouvez utiliser ce code:
Dim binding as System.ServiceModel.WSHttpBinding
binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None)
ou
System.ServiceModel.WSHttpBinding binding
binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None);
nous avons rencontré un problème étrange où le dossier dans lequel le service WCF était hébergé avait des permissions qui causaient le problème.
j'ai pu résoudre le problème en suivant les étapes suivantes:
- Aller dans IIS--> Sites-->Votre Site-->
- Volet Affichage Des Fonctionnalités-->Authentification
- Set Authentification AnonymeDésactivé
- Set Authentification WindowsActivé
si nécessaire pour spécifier le domaine (qui autorise le nom d'utilisateur et le mot de passe que le client utilise) dans webconfig vous pouvez mettre cela dans le système.serviceModel services section de service:
<identity>
<servicePrincipalName value="example.com" />
</identity>
et dans le client spécifier le domaine, le nom d'utilisateur et le mot de passe:
client.ClientCredentials.Windows.ClientCredential.Domain = "example.com";
client.ClientCredentials.Windows.ClientCredential.UserName = "UserName ";
client.ClientCredentials.Windows.ClientCredential.Password = "Password";
Cela peut être causé si le client est dans un autre domaine que le serveur.
j'ai rencontré ce problème en testant une de mes applications depuis mon PC(client) vers mon serveur de Test (cloud) et la solution la plus simple que j'ai pu imaginer était de configurer un vpn.
j'ai aussi eu le même problème wsHtppBinding
. Et j'ai juste eu à ajouter none, qui a résolu mon problème et pas besoin de passer à basicHttpBinding
. Voir Ici et vérifiez comment désactiver la sécurité WCF. Vérifiez le changement de configuration ci-dessous pour référence:
<wsHttpBinding>
<binding name="soapBinding">
<security mode="None">
<transport clientCredentialType="None" />
<message establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
pourquoi ne pouvez-vous pas simplement supprimer le paramètre de sécurité pour wsHttpBinding ("none" au lieu de "message" ou "transport")?