example - IIS alojó WCF-servicio+autenticación de Windows en IIS+TransportCredentialOnly/autenticación de Windows en basicHttpBinding
wcf iis windows 10 (5)
Deseo crear un servicio WCF alojado en IIS6 y deshabilitar la autenticación anónima en IIS. Y no use SSL.
Entonces, lo único que tengo es usar basicHttpBinging con TransportCredentialOnly
, ¿no?
Creo un directorio virtual, establezco la autenticación integrada de Windows y desmarco "Habilitar el acceso anónimo".
Aquí está mi 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>
Puedes ver que incluso no he incluido MEX-enpoint para el intercambio de metadatos. Solo un punto final y uno vinculante con la seguridad TransportCredentialOnly.
Pero cuando trato de iniciar el servicio (invocando un método a través del proxy del cliente) obtuve una excepción en el EventLog:
Excepción: System.ServiceModel.ServiceActivationException: el servicio ''/wcftest/ServiceFacadeService.svc'' no se puede activar debido a una excepción durante la compilación. El mensaje de excepción es: La configuración de seguridad para este servicio requiere autenticación "anónima" pero no está habilitada para la aplicación IIS que aloja este servicio. ---> System.NotSupportedException: la configuración de seguridad para este servicio requiere autenticación "anónima" pero no está habilitado para la aplicación IIS que aloja este servicio.
No tengo idea de por qué mi servicio requiere autenticación anónima. ¿Por qué?
Echa un vistazo a esta publicación de Nicholas Allen, del equipo de WCF, sobre este tema exacto:
http://blogs.msdn.com/drnick/archive/2007/03/23/preventing-anonymous-access.aspx
El punto final MEX aún puede ser el problema (ver esta post ). Prueba a deshabilitar MEX así:
<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>
Aquí hay una buena post sobre cómo proteger MEX.
La respuesta encontró jezell. Gracias. Mezclé bindingName y bindingConfiguration:
<endpoint address="" binding="basicHttpBinding" bindingName="MyBinding"
contract="Samples.IServiceFacadeService">
</endpoint>
Está bien:
<endpoint address="" binding="basicHttpBinding" **bindingConfiguration**="MyBinding"
contract="Samples.IServiceFacadeService">
</endpoint>
Para que el proyecto de servicio de VS wcf (nuevo proyecto de ejemplo) funcione con autenticación bajo IIS, debe:
1) Permitir el acceso anónimo en IIS
2) Prefiera sus métodos públicos con un atributo como este:
[PrincipalPermission(SecurityAction.Demand, Role = "MyADGroup")]
public string SendMyMessage(string Message)
{...}
Use basicHttpBinding para su punto final mex y aplique la misma configuración de enlace: