2008-10-20 30 views
21

Deseo crear un servicio WCF alojado en IIS6 y deshabilitar la autenticación anónima en IIS. Y no use SSL.Servicio WCF alojado de IIS + autenticación de Windows en IIS + TransportCredentialOnly/autenticación de Windows en basicHttpBinding

Así que la única manera que tengo es utilizar basicHttpBinging con TransportCredentialOnly, ¿no?

Creo un directorio virtual, establezco la autenticación integrada de Windows y desmarco "Habilitar el acceso anónimo".

Aquí es 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> 

Se puede ver que aun no he incluido MEX-Enpoint para el intercambio de metadatos. Solo un punto final y uno vinculante con la seguridad TransportCredentialOnly.

Pero cuando intenta iniciar el servicio (invocando un método throught proxy de cliente) Tengo tal 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 excepción es: Seguridad configuración de este servicio requieren autenticación 'Anónimo' pero es no está habilitado para la aplicación de IIS que aloja este servicio .. ---> System.NotSupportedException: Seguridad ajustes para este servicio requiere Autenticación 'anónima' pero es no habilitado para la aplicación IIS que aloja este servicio.

No tengo idea de por qué mi servicio requiere Autorización anónima? ¿Por qué?

Respuesta

16

Control hacia fuera este mensaje por Nicholas Allen del equipo WCF sobre este problema exacto:

http://blogs.msdn.com/drnick/archive/2007/03/23/preventing-anonymous-access.aspx

+0

Gracias, lo he leído varias veces. Sí, se trata de basicHttpBinding con autenticación de Windows integrada en IIS. Pero, no ayuda. Puedes ver que tengo exactamente la misma configuración y no funciona como esperaba. – Shrike

+15

Reemplazar "bindingName" con "bindingConfiguration" :) – jezell

+0

Genius! ¡Gracias! Me has salvado la mente :) – Shrike

7

El punto final MEX aún puede ser el problema (vea esto post). Pruebe a desactivar 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í es un buen post en asegurar MEX.

+0

No tengo punto final MEX en absoluto. Asegurar el punto final mexicano es otro desafío. Pero acepto no tenerlo en absoluto. Supongo que no tiene sentido configurar httpGetEnabled en falso si no tengo mex-endpoint. De todos modos, esto no ha ayudado, lo intenté. – Shrike

+0

Creo que WCF configura automáticamente un punto final MEX predeterminado. La sugerencia que hice fue crear manualmente el punto final MEX que anula el predeterminado y deshabilitarlo para evitar que el paso de compilación detecte el requisito de tener acceso anónimo para el punto final MEX. –

+0

Interesante. Pero todo funcionó sin punto final mexicano después de arreglar mi estúpido error. – Shrike

8

La respuesta se encontró jezell. Gracias. I mezclado BindingName y bindingConfiguration:

<endpoint address="" binding="basicHttpBinding" bindingName="MyBinding" 
      contract="Samples.IServiceFacadeService"> 
</endpoint> 

Así es:

<endpoint address="" binding="basicHttpBinding" **bindingConfiguration**="MyBinding" 
      contract="Samples.IServiceFacadeService"> 
</endpoint> 
3

Uso basicHttpBinding para su punto final mex y aplicar los mismos bindingConfiguration:

1

Para obtener VS proyecto de servicio WCF (nuevo proyecto de ejemplo) para trabajar con la autenticación en IIS, usted tiene que:

1) permitir el acceso anónimo en IIS
2) anteponga a los métodos públicos con un atributo como este:

[PrincipalPermission(SecurityAction.Demand, Role = "MyADGroup")] 
public string SendMyMessage(string Message) 
{...} 
Cuestiones relacionadas