2008-10-20 8 views
21

Je souhaite créer un service WCF hébergé dans IIS6 et désactiver l'authentification anonyme dans IIS. Et n'utilisez pas SSL.Service WCF hébergé par IIS + authentification Windows dans IIS + TransportCredentialOnly/Windows auth dans basicHttpBinding

Donc, la seule façon dont j'ai est d'utiliser basicHttpBinging avec TransportCredentialOnly, n'est-ce pas?

Je crée un répertoire virtuel, définissez Windows Integrated Auth et décochez "Activer l'accès anonyme".

Voici mon web.config:

<system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="MyBinding"> 
        <security mode="TransportCredentialOnly"> 
         <transport clientCredentialType="Windows" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <services> 
      <service name="Samples.ServiceFacadeService" behaviorConfiguration="ServiceFacadeServiceBehavior"> 
       <endpoint address="" binding="basicHttpBinding" bindingName="MyBinding" 
          contract="Samples.IServiceFacadeService"> 
       </endpoint> 
      </service> 
     </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceFacadeServiceBehavior"> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Vous pouvez voir que j'ai même pas inclus MEX-enpoint pour l'échange de métadonnées. Juste un point de terminaison et un lien avec la sécurité de TransportCredentialOnly.

Mais quand je tente de démarrer le service (invoquant une méthode throught proxy client) Je suis une telle exception dans le EventLog:

Exception: System.ServiceModel.ServiceActivationException: Le service «/wcftest/ServiceFacadeService.svc ' ne peut pas être activé en raison d'une exception lors de la compilation. Le message d'exception est : sécurité paramètres de ce service ont besoin d'authentification « Anonymous », mais il est pas activé pour l'application IIS qui héberge ce service .. ---> System.NotSupportedException: Sécurité paramètres pour ce service require Authentification 'Anonyme' mais n'est pas activé pour l'application IIS qui héberge ce service.

Je ne sais pas pourquoi mon service nécessite une authentification anonyme? Pourquoi?

Répondre

16

Vérifiez ce post par Nicholas Allen de l'équipe WCF à propos de cette question précise:

http://blogs.msdn.com/drnick/archive/2007/03/23/preventing-anonymous-access.aspx

+0

Merci, je l'ai lu plusieurs fois. Oui, il s'agit de basicHttpBinding avec l'authentification intégrée de Windows dans IIS. Mais ça n'aide pas. Vous pouvez voir, que j'ai exactement la même configuration et cela ne fonctionne pas comme prévu. – Shrike

+15

Remplacer "bindingName" par "bindingConfiguration" :) – jezell

+0

Genius! Merci! Vous avez sauvé mon esprit :) – Shrike

7

Le point de terminaison MEX peut toujours poser problème (voir post). Essayez de désactiver MEX comme ceci:

<services> 
    <!-- Note: the service name must match the configuration name for the service implementation. --> 
    <service name="MyNamespace.MyServiceType" behaviorConfiguration="MyServiceTypeBehaviors" > 
     <!-- Add the following endpoint. --> 
     <!-- Note: your service must have an http base address to add this endpoint. --> 
     <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
    </service> 
</services> 

<behaviors> 
    <serviceBehaviors> 
     <behavior name="MyServiceTypeBehaviors" > 
      <!-- This disables it. --> 
      <serviceMetadata httpGetEnabled="false" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

Voici une bonne post sur la sécurisation MEX.

+0

Je n'ai pas de point de terminaison MEX du tout. La sécurisation de mex-endpoint est un autre défi. Mais je suis d'accord pour ne pas l'avoir du tout. Je suppose que ce n'est pas la peine de définir httpGetEnabled sur false si je n'ai pas mex-endpoint. Quoi qu'il en soit, cela n'a pas aidé, j'ai essayé. – Shrike

+0

Je pense que WCF configure automatiquement un point de terminaison MEX par défaut. La suggestion que j'ai faite était de créer manuellement le point de terminaison MEX qui remplace la valeur par défaut et la désactiver pour empêcher l'étape de compilation de détecter l'exigence d'avoir un accès anonyme pour le point de terminaison MEX. –

+0

Intéressant. Mais tout s'est bien passé sans mex-endpoint après avoir corrigé ma stupide erreur. – Shrike

8

La réponse trouvée jezell. Merci. J'ai mélangé bindingName et bindingConfiguration:

<endpoint address="" binding="basicHttpBinding" bindingName="MyBinding" 
      contract="Samples.IServiceFacadeService"> 
</endpoint> 

C'est vrai:

<endpoint address="" binding="basicHttpBinding" **bindingConfiguration**="MyBinding" 
      contract="Samples.IServiceFacadeService"> 
</endpoint> 
3

Utilisez basicHttpBinding pour votre point de terminaison MEX et appliquer la même bindingConfiguration:

1

Pour obtenir VS projet de service WCF (nouveau projet d'échantillon) pour travailler avec l'authentification sous IIS, vous devez:

1) Autoriser l'accès anonyme dans IIS
2) préfixer vos méthodes publiques avec un attribut comme ceci:

[PrincipalPermission(SecurityAction.Demand, Role = "MyADGroup")] 
public string SendMyMessage(string Message) 
{...}