web-dev-qa-db-fra.com

Authentification Wcf Basic

Avoir des difficultés à utiliser l'authentification de base avec un simple service Wcf de test. Je reçois une exception:

Le service demandé, "http: //qld-tgower/test/Service.svc", n'a pas pu être activé. Consultez les journaux de suivi des diagnostics du serveur pour plus d'informations.

Et dans le journal de suivi, il indique:

Les schémas d'authentification configurés sur l'hôte ('Basic') n'autorisent pas ceux configurés sur la liaison 'BasicHttpBinding' ('Anonymous'). Veuillez vous assurer que SecurityMode est défini sur Transport ou TransportCredentialOnly. De plus, cela peut être résolu en modifiant les schémas d'authentification pour cette application via l'outil de gestion IIS, via la propriété ServiceHost.Authentication.AuthenticationSchemes, dans le fichier de configuration de l'application à l'élément <serviceAuthenticationManager>, en mettant à jour la propriété ClientCredentialType sur la liaison, ou en ajustant la propriété AuthenticationScheme sur HttpTransportBindingElement.

Mais ce que je ne comprends pas quand je nous utilise un nom d'utilisateur et un mot de passe incorrects, il le dit [~ # ~] [~ # ~] utilise l'authentification de base?

La requête HTTP n'est pas autorisée avec le schéma d'authentification client "Basic". L'en-tête d'authentification reçu du serveur était 'Basic realm = "qld-tgower"'.

Ce sont mes détails web.config

<system.serviceModel>
<services>
  <service name="WcfService"
      behaviorConfiguration="Behavior">
    <endpoint address="http://QLD-TGOWER/test/Service.svc"
              binding="basicHttpBinding"
              bindingConfiguration="httpBinding"
              contract="IService" />
  </service>
</services>
<diagnostics>
  <endToEndTracing activityTracing="false" messageFlowTracing="true" propagateActivity="true"></endToEndTracing>
</diagnostics>
<bindings>
  <basicHttpBinding>
    <binding name="httpBinding">
      <security mode="TransportCredentialOnly">
        <transport  clientCredentialType="Basic" proxyCredentialType="Basic">
        </transport>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- 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="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

et c'est mon App.config

<system.serviceModel>
    <diagnostics>
      <endToEndTracing activityTracing="true" />
      <messageLogging logMessagesAtTransportLevel="true" />
    </diagnostics>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" >
          <security mode="TransportCredentialOnly">

            <transport clientCredentialType="Basic" proxyCredentialType="Basic"></transport>
            <message clientCredentialType="UserName" />
          </security>

        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://QLD-TGOWER/test/Service.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService"
        name="BasicHttpBinding_IService" />
    </client>
</system.serviceModel>

mon application de test

private static void Main(string[] args)
{
    var proxy = new ServiceClient("BasicHttpBinding_IService");
    var clientCredentials = proxy.ClientCredentials;
    clientCredentials.UserName.UserName = "username";
    clientCredentials.UserName.Password = "password";
    var res = proxy.GetData(1);
    Console.WriteLine(res);
    Console.WriteLine("Done");
    Console.ReadKey(true);
}

Et mon service

public class Service : IService
{

   public string GetData(int value)
   {
       return string.Format("You entered: {0}", value);
   }
}

Y a-t-il quelque chose qui me manque ici?

20
TheRealTy

Modifiez le nom et le contrat du service pour inclure l'espace de noms.

Supprimez également l'adresse du point de terminaison (définissez-la sur "") et n'incluez pas proxyCredentialType dans la balise de transport.

Le résultat final du web.config devrait ressembler à ceci

  <system.serviceModel>

    <services>
      <service name="MyNameSpace.MyService" behaviorConfiguration="asdf">
        <endpoint address="" binding="basicHttpBinding" 
            bindingConfiguration="httpBinding" contract="MyNameSpace.IMyService" />
      </service>
    </services>

    <diagnostics>
      <endToEndTracing activityTracing="true" messageFlowTracing="true" 
          propagateActivity="true">
      </endToEndTracing>
    </diagnostics>

    <bindings>
      <basicHttpBinding>
        <binding name="httpBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="asdf">
          <!-- 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="true" />

        </behavior>
      </serviceBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/>

  </system.serviceModel>
19
Trent Scholl

Essayez pour les configurations client et serveur

<basicHttpBinding>
    <binding name="BasicHttpBinding_IService">
        <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
        </security>
    </binding>
</basicHttpBinding>

Installer/Activer l'authentification de base

Vous devrez peut-être également installer et appliquer l'authentification de base dans IIS.

Allez à "Programmes et fonctionnalités"/"Activer/désactiver les fonctionnalités de Windows". Activez "l'authentification de base" quelque part sous IIS et sécurité.

J'ai fermé et ouvert la console IIS et j'ai pu l'activer sous les paramètres d'authentification.

Ceci bien sûr si pour un test de développement et il vous avertit de ne pas avoir de certificat SSL.

3
Valamas

C'est ce qui a résolu le problème pour moi:

<bindings>
  <basicHttpBinding>
    <binding>
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

Pour référence, voir: https://msdn.Microsoft.com/en-gb/library/ff648505.aspx

1
Vedran

Vous n'êtes pas autorisé à utiliser l'authentification par nom d'utilisateur sur une connexion non sécurisée

Vous pouvez sécuriser le message en utilisant un transport sécurisé (par exemple SSL) ou un cryptage de message (en utilisant des certificats)

J'ai utilisé ClearUsernameBinding dans le passé avec beaucoup de succès, mais je ne le recommande pas en production. Je l'ai utilisé pour pouvoir conserver tous mes codes d'authentification de la même manière sans avoir besoin de SSL dans les environnements de développement/test, mais en le faisant fonctionner avec SSL en modifiant uniquement la configuration.

Remarque: cette liaison personnalisée n'est pas parfaite, et j'ai dû la modifier un peu pour permettre certains changements de configuration.

1
Luke Schafer