3 votes

Erreur de sécurité WCF avec le test unitaire de VS 2008

J'exécutais mon premier test d'unité de Visual Studio 2008 avec un service WCF et j'ai reçu l'erreur suivante :

T UnitTest.ServiceUnitTest.TestMyService a lancé une exception : System.ServiceModel.Security.MessageSecurityException : La requête HTTP est non autorisée avec schéma d'authentification du client 'Anonymous'. L'en-tête d'authentification reçu du serveur était 'Negotiate,NTLM'. ---> System.Net.WebException : Le serveur distant serveur distant a renvoyé une erreur : (401) Non autorisé.

J'obtiens également l'échec de l'audit suivant dans le journal de sécurité :

Échec de la connexion : Motif : L'utilisateur n'a pas pas été autorisé demandé sur cette machine
Utilisateur Nom : (Compte d'invité Internet)
Domaine :
Type de connexion : [ ]
Processus de connexion : IIS
Paquet d'authentification :
MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
Nom du poste de travail :

J'héberge le service WCF dans IIS 6.0 sur une machine Windows XP SP3. J'ai coché les cases "Accès anonyme" et "Authentification Windows intégrée" pour le répertoire virtuel du service WCF.

Voici mon fichier de configuration pour le service :

<system.serviceModel>
    <services>
        <bindings>
            <basicHttpBinding>
                <binding name="MyBinding">
               <security mode="None" />
           </binding>
            </basicHttpBinding>
            <customBinding>
                <binding name="MyBinding">
               <transactionFlow />
                    <textMessageEncoding />
                    <httpsTransport authenticationScheme="Ntlm"/>
                </binding>
            </customBinding>
            <wsHttpBinding>
                <binding name="MyBinding">
                   <security mode="None" />
               </binding>
            </wsHttpBinding>
        </bindings>
        <service 
            behaviorConfiguration="Service1Behavior"
            name="Service1"
        >
            <endpoint 
                address="" 
                binding="wsHttpBinding"
                bindingConfiguration="MyBinding"
                contract="IService1"
            >
                <identity>
                    <dns value="localhost" />
                   </identity>
            </endpoint>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Service1Behavior">
                <serviceMetadata httpGetEnabled="true" />
                   <serviceDebug includeExceptionDetailInFaults="false" />
               </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

5voto

Michael Kniskern Points 7276

J'ai dû modifier les configurations suivantes des services IIS et WCF pour surmonter l'exception "Negotiate,NTLM".

Configurations IIS :

-- Non coché "Accès anonyme" c l'authentification Windows intégrée" dans le paramètre de sécurité de l'annuaire pour l'annuaire virtuel du répertoire virtuel du service WCF.

Services WCF :

-- implémente le basicHttpBinding et configure le basicSettingBinding s en mode "TransportCredentialsOnly" et le paramètre de sécurité TransportClientCredentialType à "Windows"

Voici ma configuration de service wcf mise à jour :

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="windowsBasicHttpBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
       </basicHttpBinding>
    </bindings>
    <services>
        <service    
      behaviorConfiguration="CityOfMesa.ApprovalRouting.WCFService.RoutingServiceBehavior"
           name="CityOfMesa.ApprovalRouting.WCFService.RoutingService"
        >
            <endpoint 
                binding="basicHttpBinding" bindingConfiguration="windowsBasicHttpBinding"
                name="basicEndPoint"    
                contract="CityOfMesa.ApprovalRouting.WCFService.IRoutingService" 
            />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior 
                name="CityOfMesa.ApprovalRouting.WCFService.RoutingServiceBehavior"
            >
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
           </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

2voto

jezell Points 2430

Lorsque vous avez securityMode="None" dans votre binding, vous devez désactiver l'authentification intégrée.

1voto

Karg Points 585

L'authentification par défaut est Windows (ou NTLM), vous devrez donc spécifier que vous ne voulez pas d'authentification dans votre fichier de configuration.

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="myBinding">
        <security mode="None" />
      </binding>
  </bindings>
</system.serviceModel>

ajoutez également cet attribut au point de terminaison

bindingConfiguration="myBinding"

L'élément binding spécifie les modifications du comportement standard du wsHttpBinding.

L'attribut "bindingConfiguration="myBinding" sur le point de terminaison indique que ce point de terminaison doit utiliser les modifications que nous avons spécifiées.

0voto

Michael Kniskern Points 7276

Par ailleurs.....Il y avait un paramètre GPO "NTLM Authentication Level" qui contrôlait l'authentification et qui faisait que le test unitaire générait l'exception "Negotiate,NTLM".

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