2009-08-18 25 views
8

He seguido numerosos artículos msdn y la guía codeplex, pero no puedo conseguir que WCF funcione con la autenticación y delegación de Kerberos y agradecería un poco de ayuda.WCF and Kerberos Authentication

Configuración

tengo el servicio de WCF en un sitio web de IIS en una máquina remota

  • IIS 6.0 en Windows 2003 R2 - SP 2
  • El SPN para la máquina se ha añadido (http/myserver & & http/myserver: 8080)
  • Se ha creado una cuenta AD para el grupo de aplicaciones IIS
  • La cuenta de AD tiene el ajuste, permitir la delegación (para Kerberos), se define como true

estoy usando Brian Booth's debug site en 8080 y el sitio cumple todos los requisitos para la delegación Kerberos. El sitio de depuración de IIS tiene autenticación anónima desactivada y autenticación de Windows integrada activada.

He duplicado estas configuraciones en el sitio que aloja el servicio WCF.

Servicio Web - Web Config (original)

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WsHttpBindingConfig"> 
       <security> 
        <message negotiateServiceCredential="true" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="ServiceBehavior" name="Service">  
      <endpoint address="" 
       binding="wsHttpBinding" 
       bindingConfiguration="WsHttpBindingConfig" 
       contract="IService">  
       <identity>  
        <servicePrincipalName value="http/myserver" />  
        <dns value="" />  
       </identity>  
      </endpoint>  
      <endpoint address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />  
     </service>  
    </services>  
    <behaviors>  
     <serviceBehaviors>  
      <behavior name="ServiceBehavior">  
       <serviceMetadata httpGetEnabled="true"/>  
       <serviceDebug includeExceptionDetailInFaults="true"/>  
       <serviceAuthorization 
        impersonateCallerForAllOperations="true" />  
      </behavior>  
     </serviceBehaviors>  
    </behaviors>  
</system.serviceModel> 

Servicio Web - Método Web

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public string GetCurrentUserName() 
{ 
    string name = WindowsIdentity.GetCurrent().Name; 
    return name; 
} 

cliente de App - Aplicación de configuración

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IService" 
       ... /> 
       ... 
       <security mode="Message"> 
        <transport clientCredentialType="Windows" 
         proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="Windows" 
         negotiateServiceCredential="true" 
         algorithmSuite="Default" 
         establishSecurityContext="true" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://myserver/Service.svc" 
      binding="wsHttpBinding" 
      bindingConfiguration="WSHttpBinding_IService" 
      contract="KerberosService.IService" 
      name="WSHttpBinding_IService"> 
      <identity> 
       <servicePrincipalName value="http/myserver" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Error de aplicación

El siguiente error se produce cuando mi aplicación de prueba, una aplicación de Windows Forms, intenta llamar al método Web:

"La petición HTTP no está autorizado con el esquema de autenticación cliente 'Anonymous' . El encabezado de autenticación recibida del servidor era 'negociar, NTLM "

registro de eventos

el siguiente error en el registro de eventos:.

Excepción: Sistema .ServiceModel.ServiceActivationException: El servicio '/Service.svc' no puede ser activado debido a una excepción durante compila ció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.

Lo que no entiendo. El objetivo de este servicio es no permitir la autenticación anónima, cada usuario/solicitud debe autenticarse utilizando tickets de Kerberos, y luego pasarlos a otras máquinas.

¿Cómo debo configurar este servicio WCF para la autenticación y delegación de Kerberos?

Revisión 1

Después de leer this SO question Quité el punto final de metadatos. Esto no ha resuelto el problema.

Revisión 2

Después de más investigación me encontré con un par de mensajes que sugieren que cambiar wsHttpBinding a basicHttpBinding. La modificación de esa parte del web.config se ha incluido a continuación, y el punto final del servicio se ha actualizado para hacer referencia a ese enlace. Servicio

Web - Web Config (revisado)

<basicHttpBinding> 
    <binding name="basicBindingConfig"> 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows" 
       proxyCredentialType="Windows" 
       realm="" /> 
     </security> 
    </binding> 
</basicHttpBinding> 

cliente de App - Aplicación de configuración (revisado)

<!-- ... --> 
<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="Windows" 
     proxyCredentialType="Windows" 
     realm="" /> 
    <message clientCredentialType="UserName" 
     algorithmSuite="Default" /> 
</security> 
<!-- ... --> 

error (revisado)

La corriente el error parece que contiene una autenticación de Kerberos encabezado de ntication

La petición HTTP no está autorizado con el esquema de autenticación del cliente 'negociar'. El encabezado de autenticación recibida del servidor era 'Negociar SOMEHUGESCARYKEYHERE

+1

Nota, publiqué y borré algo similar ayer, esta publicación incluye revisiones basadas en más investigaciones y debería ser más clara para leer. – blu

+1

Agregué la configuración de la aplicación revisada en función de los comentarios de marc_s. – blu

Respuesta

3

Algo que noto: no parecen el cliente y el servidor de configuración a un acuerdo sobre el modo de seguridad.

En la sección original, tiene <security>..... en web.config (omitió el modo = "mensaje"), y <security mode="Message"> en el lado del cliente.

Después de su edición, parece que el lado del cliente no ha cambiado, pero el servidor (web.config) ahora contiene <security mode="TransportCredentialOnly">.

La pregunta es realmente: ¿se puede garantizar que solo habrá un tramo de red entre el cliente y el servidor al que se llama? Es decir. ¿Esto está detrás de un firewall corporativo? En ese caso, recomendaría el enlace netTcp con <security mode="Transport"> en ambos extremos.

Si ese no es el caso, entonces está bien con wsHttpBinding (que admite más características de seguridad y fiabilidad, pero es más lento y "más pesado") o basicHttpBinding. En ese caso, deberá usar <security mode="Message"> en ambos extremos y autenticar el servicio con un certificado (para que el servicio y el cliente tengan un "secreto" común que usar para el cifrado).

Intentaré excluir las partes de suplantación para el principio y simplemente comenzar a usar primero la comunicación básica y la autenticación mutua entre el servicio y el cliente; una vez que esté en su lugar, puede comenzar a agregarle los bits de suplantación, y siempre puedes recurrir a una configuración conocida que funciona.

David Sackstein tiene una great series of blog posts explicar los cinco escenarios de seguridad que gurú de la industria Juval Lowy ha identificado (en su libro Programming WCF - la Biblia WCF) como los más comunes y más útiles - con el fin de limitar el número de posibles combinaciones de parámetros es posible que desee ajustar. Uno de ellos es un escenario de "Internet" que probablemente se aplicaría aquí, si su servicio es externo.

Marc

+1

Gracias por la respuesta. No incluí el código de cliente actualizado, pensé que la pregunta ya tenía suficiente desorden. Revisaré la información que me proporcionó, gracias. – blu

+1

"autenticar el servicio con un certificado", esto es algo que alguien intenta evitar. Esperábamos usar tickets Kerberos correctos para autenticar usuarios y delegarlos hasta máquinas de servicios de fondo como SP y SQL. – blu

7

Para mí la configuración actual funciona:

en el servidor:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="wsHttpBindingConf" useDefaultWebProxy="true"/> 
    </wsHttpBinding> 
    </bindings> 

    <services> 
    <service behaviorConfiguration="returnFaults" name="Epze.BusinessLayer.ZeitManager"> 
     <endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpBindingConf" contract="Epze.Contract.IZeitManager"/> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
    </services> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="returnFaults"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <serviceAuthorization impersonateCallerForAllOperations="true"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Establecer el siguiente atributo en todos los métodos para la WCF:

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 

En el cliente:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IZeitManager" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> 
      <security mode="Message"> 
       <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/> 
       <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true"/> 
      </security> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 

    <behaviors> 
    <endpointBehaviors> 
     <behavior name="Delegation"> 
     <clientCredentials> 
      <windows allowedImpersonationLevel="Delegation" /> 
     </clientCredentials> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors>   

    <client> 
    <endpoint address="http://server.mydomain.net/ePZEsvc/ZeitManager.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IZeitManager" 
       contract="External.Epze.IZeitManager" name="WSHttpBinding_IZeitManager" behaviorConfiguration="Delegation"> 
     <identity> 
      <servicePrincipalName value="HOST/localhost"/> 
     </identity>      
    </endpoint> 
    </client> 
</system.serviceModel> 

HTH, Sven

+1

¿Qué hay de su configuración de IIS para los métodos de autenticación? ¿El acceso anónimo está desactivado? – Jonathan

+1

Tengo la autenticación de Windows y el acceso anónimo habilitados. Pero solo necesitará Anónimo al agregar el punto final mex (IMetadataExchange) para su servicio. –

1

Usted debe probar su configuración inicial y asegúrese de establecer el IIS para la autenticación anónima y ser ventanas al mismo tiempo.El razón es cuando se está utilizando de seguridad predeterminado es wsHttpBinding seguridad de los mensajes y no hay seguridad de transporte definida a menos que desee hacer https. SO Clr afirma que necesita autenticación anónima activada en IIS.

2

Debe especificar una configuración de comportamiento en la configuración de su cliente. SVCUtil no se genera automáticamente. Esto resolvió mi problema y ahora estoy usando Kerberos exitosamente. ¡Fue una misión!

<client>   
    <endpoint address="..."    
    binding="customBinding" bindingConfiguration="..."    
    contract="..." name="..." behaviorConfiguration="ImpersonationBehavior" />     
    </client>   
    <behaviors> 
     <endpointBehaviors>    
     <behavior name="ImpersonationBehavior">    
       <clientCredentials>     
       <windows allowedImpersonationLevel="Impersonation"/>      </clientCredentials>    
    </behavior>      
    </endpointBehaviors>     
    </behaviors> 
Cuestiones relacionadas