c# - net - Hacer servicio Wcf IntegratedWindowsAuthentication
svc iis configuration (8)
Añadiendo esto funcionó para mí.
<bindings>
<webHttpBinding>
<binding>
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</webHttpBinding>
</bindings>
Recibo el siguiente error cuando configuré la autenticación de Windows habilitada y anónima para deshabilitada en IIS.
Los esquemas de autenticación configurados en el host (''IntegratedWindowsAuthentication'') no permiten aquellos configurados en el enlace ''BasicHttpBinding'' (''Anonymous''). Asegúrese de que SecurityMode esté configurado en Transport o TransportCredentialOnly. Además, esto se puede resolver cambiando los esquemas de autenticación para esta aplicación a través de la herramienta de administración de IIS, a través de la propiedad ServiceHost.Authentication.AuthenticationSchemes, en el archivo de configuración de la aplicación en el elemento, actualizando la propiedad ClientCredentialType en el enlace, o ajustando la propiedad AuthenticationScheme en el HttpTransportBindingElement.
El archivo web.config de mi servicio Wcf es el siguiente ...
<?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>
Por favor aconséjame..
Al igual que las otras respuestas, necesitaba actualizar el enlace en mi Web.config a esto:
<basicHttpBinding>
<binding name="basicHttpBindin1">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
Pero también necesitaba actualizar la creación de instancias de mi enlace:
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;
En .Net 4.0+, la configuración simplificada de WCF utiliza las configuraciones "anónimas" cuando las configuraciones no se establecen explícitamente para cada servicio en la sección <servicios>. Si elimina el nombre = "BasicHttpEndpointBinding" del elemento <binding>, o si duplica ese elemento <binding> como un elemento nuevo sin atributo de nombre, se convertirá en el enlace anónimo predeterminado que usarán sus servicios WCF. Esto suele ser útil en los casos en los que debe servir y consumir servicios WCF que pueden no tener todos la misma configuración, pero al menos puede establecer una configuración predeterminada para los servicios que no tienen un conjunto de configuración específico. El concepto predeterminado / anónimo también es aplicable a los elementos <behavior>.
<bindings>
<basicHttpBinding>
<binding> <!--Notice, no name attribute set-->
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Además, podría agregar que si sus servicios WCF requieren autenticación, esto significa que tendrá que consumir el servicio usando una cuenta de usuario real, o deberá otorgar el acceso a la cuenta DOMAIN / CLIENTCOMPUTERNAME $ para el servicio, por lo tanto, Quizás la solución adecuada para muchas personas sea modificar la configuración para permitir el acceso anónimo (que no se trata en mi respuesta). Sin embargo, a veces en realidad elijo asegurar mis servicios WCF con la autenticación de Windows (Kerberos).
No estoy completamente seguro de por qué, pero cuando agregué el atributo ''Fábrica'' a mi archivo .SVC (es necesario que lo arrastre explícitamente a Visual Studio), todo simplemente funciona , ¡sin ningún cambio en la configuración predeterminada en Web.config!
Agregué Factory = "System.ServiceModel.Activation.WebServiceHostFactory", así que mi archivo .SVC se fue de esto:
<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" %>
a esto:
<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
El único efecto secundario parece ser que al hacer clic en el archivo .SVC en el navegador, aparece un error de "Punto final no encontrado", pero el servicio funciona bien cuando lo invoca correctamente de todos modos. Como se mencionó anteriormente, estoy usando un Web.config predeterminado con .NET 4.6 ( configuración simplificada de WCF ), por lo que es posible que tenga que agregar detalles de punto final para que funcione nuevamente.
Recibí este error al actualizar de .NET 4.0 a .NET 4.5.2. Cambié el clientCredentialType de
<security mode="TransportCredentialOnly">
<transport clientCredentialType="None"/>
</security>
a
<security mode="TransportCredentialOnly">
<transport clientCredentialType="InheritedFromHost"/>
</security>
Sin embargo, configurar clientCredentialType = "Windows" funciona igual de bien.
Tuve el mismo problema al consumir la URL web de WCF ya existente. Intenté todas las respuestas que se mencionan aquí, pero finalmente, solo dos cosas ayudaron.
- Cambiar la configuración en "Activar y desactivar las características de Windows".
Habilitar la autenticación anónima junto con la autenticación de Windows en el servidor IIS local.
Yo había agregado un enlace webHttpBinding y apunté mi punto final a eso, que la configuración de seguridad necesitaba para trabajar. Sin eso, mi punto final usó los enlaces de configuración de WCF predeterminados:
<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>
<services>
<service name="Test.Service1" behaviorConfiguration="TestName">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpointBinding" contract="Test.IService1" />
</service>
</services>
Se solucionó mi problema.