web-dev-qa-db-fra.com

Rendre le service Wcf intégréWindowsAuthentication

Le message d'erreur suivant s'affiche lorsque j'ai défini Activé et anonyme pour l'authentification Windows comme étant désactivé dans IIS.

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

Le fichier web.config de My Wcf Service est le suivant ...

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpEndpointBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpEndpointBinding"
        contract="Test.IService1" name="BasicHttpEndpoint" />
    </client>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceAuthenticationManager 
             authenticationSchemes="IntegratedWindowsAuthentication"/>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpBinding" scheme="http" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
         multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

S'il vous plaît des conseils ..

19
user214471

Dans .Net 4.0+, Configuration simplifiée de WCF utilise les configurations "anonymes" lorsque les configurations ne sont pas explicitement définies par services dans la section <services>. Si vous supprimez l'élément name = "BasicHttpEndpointBinding" ou si vous dupliquez cet élément en tant que nouvel élément sans attribut name, il deviendra la liaison anonyme par défaut utilisée par vos services WCF. Cela est souvent utile dans les cas où vous devez servir et consommer des services WCF qui peuvent ne pas avoir tous la même configuration - mais au moins, vous pouvez définir une configuration par défaut pour les services ne disposant pas d'un ensemble de configuration spécifique. Le concept par défaut/anonyme est également applicable aux éléments <behavior>.

<bindings>
  <basicHttpBinding>
    <binding> <!--Notice, no name attribute set-->
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

De plus, je pourrais ajouter que si vos services WCF nécessitent une authentification, cela signifie que vous devez soit utiliser le service à l’aide d’un compte utilisateur réel, soit autoriser le compte DOMAIN\CLIENTCOMPUTERNAME $ à accéder au service. peut-être que la solution appropriée pour beaucoup de gens pourrait être de modifier la configuration pour permettre un accès anonyme (ce qui n’est pas abordé dans ma réponse). Néanmoins, je choisis parfois de sécuriser mes services WCF avec l’authentification Windows (Kerberos).

42
scradam

Ajouter cela a fonctionné pour moi.

        <bindings>
        <webHttpBinding>
            <binding>
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
12
Rian

J'ai eu cette erreur lors de la mise à jour de .NET 4.0 vers .NET 4.5.2. J'ai changé le clientCredentialType de 

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="None"/>
</security>

à

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="InheritedFromHost"/>
</security>

Cependant, définir clientCredentialType = "Windows" fonctionne également.

2
GunnarS
<services>
      <service name="Test.Service1" behaviorConfiguration="TestName">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpointBinding" contract="Test.IService1" />
      </service>
    </services>

Cela a résolu mon problème.

0
Raju S Nair

J'avais ajouté un lien WebHttpBinding et pointé mon point final vers celui sur lequel les paramètres de sécurité devaient fonctionner. Sans cela, mon noeud final utilisait les liaisons de configuration WCF par défaut:

    <services>
  <service behaviorConfiguration="ServiceBehavior" name="Service">
    <endpoint address="" binding="webHttpBinding" contract="IService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<bindings>
  <webHttpBinding>
      <binding>
        <!--Notice, no name attribute set-->
        <security mode="TransportCredentialOnly">
          <transport clientCredentialType="Windows" />
        </security>
      </binding>
  </webHttpBinding>

</bindings>
0
Kevin Raffay

J'avais le même problème lorsque je consommais déjà une URL Web existante de la WCF ..__ J'ai essayé toutes les réponses mentionnées ici, mais en fin de compte, seules deux choses ont aidé.

  1. Modification du paramètre dans "Activer et désactiver les fonctionnalités de Windows".

 enter image description here

Activation de l'authentification anonyme avec l'authentification Windows sur le serveur local IIS .  enter image description here

0
Khushi4.net

Je ne suis pas tout à fait sûr de savoir pourquoi, mais lorsque j'ai ajouté l'attribut "Factory" à mon fichier .SVC (vous devez le faire glisser explicitement vers Visual Studio), tout ce que vous avez fonctionne - sans modifie les paramètres par défaut dans Web.config!

J'ai ajouté Factory = "System.ServiceModel.Activation.WebServiceHostFactory" afin que mon fichier .SVC passe de ceci:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" %>

pour ça:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Le seul effet secondaire semble être que lorsque vous cliquez sur le fichier .SVC dans le navigateur, vous obtenez une erreur «Endpoint not found», mais le service fonctionne correctement lorsque vous l'appelez correctement. Comme mentionné précédemment, j'utilise un fichier Web.config par défaut avec .NET 4.6 ( Configuration simplifiée de WCF ). Il est donc peut-être nécessaire d'ajouter des détails sur les points de terminaison pour que cela fonctionne à nouveau.

0
QA Collective

Comme les autres réponses, je devais mettre à jour la liaison dans mon Web.config à ceci:

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

Mais je devais aussi mettre à jour l'instanciation de ma liaison:

var binding = new BasicHttpBinding { MaxReceivedMessageSize = 1000000, ReaderQuotas = { MaxDepth = 200 } };

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
0
Chris Schiffhauer