2012-01-23 11 views
6

Soy bastante nuevo en WCF pero tengo un servicio WCF alojado en IIS que tiene varias consultas a nuestro servidor SQL. Estoy consumiendo el servicio WCF con una aplicación WPF. Lo que trato de hacer es permitir que la autenticación de Windows pase desde el cliente WPF, al servicio WCF, al servidor SQL para que las consultas SQL se ejecuten como el usuario del cliente. He intentado configurar el sitio web y el host de varias formas sin suerte hasta el momento.Servicio WCF hospedado por IIS y consultas SQL mediante la autenticación de Windows

En mi sitio web de Servicio WCF, tengo Autenticación anónima = verdadera (para MEX), Suplantación de ASP.NET = verdadera y Autenticación de Windows = verdadera.

En mi WCF Servicio Web.config:

<configuration> 
    <system.web> 
    <customErrors mode="Off"/> 
    <authentication mode="Windows"/> 
    <compilation debug="true" targetFramework="4.0"> 
     <assemblies> 
     <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     </assemblies> 
    </compilation> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding maxReceivedMessageSize="5000000" name="WindowsSecurity"> 
      <readerQuotas maxDepth="200"/> 
      <security mode="Transport"> 
      <transport clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="ADATrackingService" behaviorConfiguration="ServiceBehavior"> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="WindowsSecurity" 
      name="wsHttpEndpoint" contract="IADATrackingService" /> 
     <endpoint address="mex" binding="mexHttpsBinding" name="MexHttpsBindingEndpoint" 
      contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceAuthorization impersonateCallerForAllOperations="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
    <connectionStrings> 
    <add name="ADATrackingEntities" connectionString="metadata=res://*/EntityModel.ADATrackingModel.csdl|res://*/EntityModel.ADATrackingModel.ssdl|res://*/EntityModel.ADATrackingModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MYSERVER;initial catalog=ADATracking;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 
</configuration> 

Luego, en mi cliente WPF app.config que tengo:

<configuration> 
    <system.serviceModel> 
     <behaviors> 
     <endpointBehaviors> 
      <behavior name="WindowsAuthentication"> 
      <clientCredentials> 
       <windows allowedImpersonationLevel="Delegation"/> 
      </clientCredentials> 
      </behavior> 
     </endpointBehaviors> 
     </behaviors> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="wsHttpEndpoint" 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="5000000" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="200" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Transport"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="https://MyService.svc" 
       binding="wsHttpBinding" behaviorConfiguration="WindowsAuthentication" bindingConfiguration="wsHttpEndpoint" 
       contract="ADATrackingService.IADATrackingService" name="wsHttpEndpoint"> 
       <identity> 
        <servicePrincipalName value="host/MyServer.com" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

Mis llamadas de servicio se acaban de volver de consultas simples SQL utilizando los metadatos para permitir la suplantación. Cada vez que ejecuto el cliente y llamo a algo de mi servicio, estoy obteniendo un error abriendo la conexión de datos para "NT Authority/ANONYMOUS LOGIN" incluso con AnonymousAuthentication = false set in IIS ??? Cualquier ayuda sería muy apreciada. ¡Gracias!

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public List<IndividualDisability> GetIndividualDisabilities() 
{ 
    WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity; 
    if (callerWindowsIdentity == null) 
    { 
     throw new InvalidOperationException 
     ("The caller cannot be mapped to a Windows identity."); 
    } 
    using (callerWindowsIdentity.Impersonate()) 
    { 
     using (var context = new ADATrackingEntities()) 
     { 
      return context.IndividualDisabilities.OfType<IndividualDisability>().Include("ADACode").Include("Individual").Include("Disability").ToList(); 
     } 
    } 
} 

Respuesta

5

Bueno, después de navegar alrededor de algunos más hoy. Finalmente lo tengo funcionando! El problema era que en el directorio activo, necesitaba permitir la delegación en el cuadro de SQL Server. Hay una configuración en AD que debes configurar en el cuadro del servidor web para que pueda delegar en el servicio SQl en tu caja del servidor SQl en el puerto 1433. También tuve que asegurarme de que estaba configurado para la autenticación kerebos en el servidor web. Este blog explica exactamente mi situación y me ayudó a conseguir que funcione de principio a fin:

ASP.Net Impersonation

+0

¡Sobresaliente! Me alegra que lo hayas hecho funcionar. – CodeWarrior

0

En IIS, que se han eliminado de forma explícita la autenticación anónima? Haga lo siguiente:

  1. Abra el Administrador de IIS.
  2. Navegue hasta su aplicación de servicio WCF.
  3. En la Vista de características, en IIS, haga clic en Autenticación.
  4. Elimine cualquier esquema de autenticación excepto Autenticación de Windows. (Anónimo está habilitado de forma predeterminada.)

Para asegurarse de que su aplicación WPF no interfiere de ninguna manera, primero realice una prueba con wcftestclient.

  1. Abra una ventana de mandatos de Desarrolladores (menú Inicio> Programas> Microsoft Visual Studio 2010> Visual Studio Tools> Visual Studio Símbolo del sistema (2010))
  2. wcftestclient https://url.to/myservice.svc
+0

Gracias por la respuesta. Creo que todo se configuró correctamente en IIS y el servicio. Cuando se ejecuta con el cliente de prueba WCF ahora recibo un error: "O bien no se proporcionó un nivel de suplantación requerido, o el nivel de suplantación proporcionado no es válido". – ccorrin

+0

¡Ah, ja! ¿Has intentado codificar tu suplantación solo por el gusto de hacerlo? Agregue lo siguiente a la web.config para asegurarse de que desde el servicio al servidor SQL está bien: CodeWarrior

+0

Recibo un error incluso cuando se codifican los valores en la web.config. "No se pudo iniciar sesión en SQL para NT Authority/Login anónimo". Estoy pensando que puede haber algo que deba configurar en mi cuadro SQL. – ccorrin

Cuestiones relacionadas