2011-10-19 64 views
8

Este problema que estoy teniendo no ocurre para todos los clientes que están accediendo a nuestros servicios, pero lo que es coherente es que cuando se produce el error, está sucediendo en la misma llamada de servicio para un puñado de clientes.Obteniendo 403 Error prohibido. La solicitud HTTP estaba prohibida con el esquema de autenticación del cliente 'Anónimo'

Aquí están los detalles de la excepción:

System.ServiceModel.Security.MessageSecurityException The HTTP request was forbidden with client authentication scheme 'Anonymous'. System.ServiceModel.Security.MessageSecurityException: The HTTP request was forbidden with client authentication scheme 'Anonymous'. > ---> System.Net.WebException: The remote server returned an error: (403) Forbidden. at System.Net.HttpWebRequest.GetResponse() at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) --- End of inner exception stack trace --- Server stack trace: at System.ServiceModel.Security.IssuanceTokenProviderBase 1.DoNegotiation(TimeSpan timeout) at System.ServiceModel.Security.SspiNegotiationTokenProvider.OnOpen(TimeSpan timeout) at System.ServiceModel.Security.TlsnegoTokenProvider.OnOpen(TimeSpan timeout) at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Security.CommunicationObjectSecurityTokenProvider.Open(TimeSpan timeout) at System.ServiceModel.Security.SecurityUtils.OpenTokenProviderIfRequired(SecurityTokenProvider tokenProvider, TimeSpan timeout) at System.ServiceModel.Security.SymmetricSecurityProtocol.OnOpen(TimeSpan timeout) at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory 1.ClientSecurityChannel 1.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation operation, EndpointAddress target, Uri via, SecurityToken currentToken, TimeSpan timeout) at System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan timeout) at System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan timeout) at System.ServiceModel.Security.SecuritySessionClientSettings 1.ClientSecuritySessionChannel.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade) at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at > Proxy.FileTransferService.IFileTransferService.EstablishProxy(DownloadRequest request) at Proxy.FileTransferService.FileTransferServiceClient. Proxy.FileTransferService.IFileTransferService.EstablishProxy(DownloadRequest request) at NormalFileTransferServiceClient.Download(Int32 packageId, IStreamWriter downloader, Archiver archiver) at LoggingFileTransferServiceClient.Download(Int32 packageId, ISt

Esa excepción se está lanzando por el cliente.

La configuración de proxy cliente para IFileTransferService es:

<binding name="WSHttpBinding_IFileTransferService" 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="Mtom" 
    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="UserName" negotiateServiceCredential="true" 
     algorithmSuite="Default" establishSecurityContext="true" /> 
    </security> 
</binding> 

    <endpoint address="http://[hostname]/FileTransferService.svc/FileTransfer" 
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IFileTransferService" 
    contract="Proxy.FileTransferService.IFileTransferService" 
    name="WSHttpBinding_IFileTransferService"> 
    <identity> 
     <certificate encodedValue="a long string"/> 
    </identity> 
    </endpoint> 

La configuración del servicio es

<service behaviorConfiguration="ServiceBehavior" 
    name="Services.FileTransferService"> 
     <endpoint name="WSHttpBinding_IFileTransferService" 
     binding="wsHttpBinding" 
     bindingConfiguration="MtomWSHttpBinding" 
     contract="Services.IFileTransferService" 
     address="/FileTransfer"/> 
     <endpoint binding="basicHttpBinding" 
     bindingConfiguration="FileTransferServicesBinding" 
     contract="Services.IFileTransferService"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://[hostname]/FileTransferService.svc"/> 
      </baseAddresses> 
     </host> 
</service> 

<binding name="wsHttpBinding" 
     maxReceivedMessageSize="2147483647" 
     receiveTimeout="5" 
     useDefaultWebProxy="false"> 
     <readerQuotas maxDepth="2147483647" 
      maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647" /> 
    <security mode="Message"> 
    <message clientCredentialType="UserName" /> 
    </security> 
</binding> 

<basicHttpBinding> 
    <binding name="FileTransferServicesBinding" 
      maxReceivedMessageSize="10067108864" 
      messageEncoding="Mtom" 
      transferMode="Streamed" 
      useDefaultWebProxy="false"> 
     <security mode="None"> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 

Nota: Unos clientes están utilizando el basicHttpBinding (si configurado todo correctamente). En una versión posterior del cliente, que puede no haberse distribuido por completo (razón por la cual tengo que admitir la versión 2), cambié el proxy para usar el extremo wsHttpBinding en su lugar. Me pregunto si este error que estoy recibiendo es específico de basicHttp y, de ser así, quizás no tenga estas configuraciones configuradas correctamente. Estoy bajo la suposición de que los clientes que obtienen este error 403 están usando el wsHttpBinding.

Este es el código para el servicio:

public RemoteBinaryInfo EstablishProxy(DownloadRequest request) 
{ 
    int packageId = request.PackageId; 

    System.IO.MemoryStream stream = new System.IO.MemoryStream(packageRepository.GetPackageBinary(packageId)); 

    DisposeStreamWhenOperationIsComplete(stream, OperationContext.Current); 

    RemoteBinaryInfo result = new RemoteBinaryInfo(); 
    result.Length = stream.Length; 
    result.MemoryByteStream = stream; 
    return result; 

} 

private static void DisposeStreamWhenOperationIsComplete(System.IO.MemoryStream stream, OperationContext clientContext) 
{ 
    clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args) 
    { 
     if (stream != null) 
      stream.Dispose(); 
    }); 
} 

¿Alguien sabe si esto deshacerse de esta excepción es algo EL PLAZO mi control? ¿Hay algún cambio de configuración que pueda realizar en los archivos de configuración del cliente o del servicio?

Si necesita más información de mí, por favor hágamelo saber.

+0

Si aún no lo hizo, intente exponer un método simple de hello world para aislar el problema. – JoeBilly

Respuesta

0

Me parece que los clientes que están recibiendo MessageSecurityException no están proporcionando un nombre de usuario/contraseña válido con su solicitud.

Ver el tema siguiente MSDN http://msdn.microsoft.com/en-us/library/ms733131.aspx

+0

Si se hace lo anterior, ¿existe una conexión entre los clientes que reciben el error del dominio del que están llamando? También sería útil descartar que los clientes que reciben un error no envíen sus solicitudes a través de un proxy. Si nada de eso ayuda, active el seguimiento de mensajes tanto en el cliente como en el servicio: http://msdn.microsoft.com/en-us/library/ms730064.aspx –

+0

El nombre de usuario y la contraseña se proporcionan directamente en el código después de está descifrado No hay interacción humana entre el cliente y estos servicios. Los proxies que generé se distribuyen con una aplicación y se ejecutan automáticamente. – SideFX

+0

Ya tengo este creds.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust; pero, posiblemente, esto podría solucionar el problema: creds.ServiceCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine; El error que recibo no está sucediendo para cada solicitud del cliente, pero tal vez una configuración de red de cliente específica haría necesario agregar el código anterior. ¿Cuál sería el propósito de indicar explícitamente la ubicación del certificado del servidor en el cliente? – SideFX

0

Así que hay un servicio web configurado en IIS utilizando la autenticación anónima, y ​​se obtiene un error de prohibido 403 por sólo un puñado de usuarios.

Según mi propia experiencia, esto normalmente se debe a una excepción de acceso denegado al acceder a un recurso del sistema controlado por ACL, como el sistema de archivos.

Cada usuario conectado anómalamente tendrá su solicitud procesada (suponiendo IIS 7) por el proceso w3wp.exe que normalmente tiene la identidad del grupo de aplicaciones (IIS AppPool/nombreGrupoAplicaciones), si que la identidad no se añade a las listas de control de acceso requeridos una excepción de acceso denegado hará que IIS responda con un error 403.

Normalmente agrego la identidad del grupo de aplicaciones a un grupo y luego agrego el grupo a los recursos necesarios.

Si no puede averiguar qué recursos pueden estar causando la excepción, intente buscar en el registro de eventos de seguridad las entradas "Audit Failure" para obtener pistas. Es posible que deba configurar la política de seguridad local para registrar eventos de seguridad.

buena suerte

3

En mi caso este error fue del servidor proxy HTTP de nuestra organización. Encontrado desde: MessageSecurityException.InnerException.Response.Headers:

{Mime-Version: 1.0
X-Calamar-Error: ERR_ACCESS_DENIED 0
X-Cache: falta de <
X-Cache-Lookup: NINGUNO de < proxy- dirección-servidor>
Proxy-Connection: close
Content-Length: 2165
Content-Type: text/html
Fecha: Miér 25 Abr 2012 10:55:39 GMT
Servidor: squid/3.0.STABLE25
Vía: 1.0 < proxy-server-address> (squid/3.0.STABLE25)
}

En mi caso también se produjo por un método de transferencia de archivos que la transferencia de archivos trozos en una matriz byte de tamaño 16384. Al reducir el tamaño a 10000, se resolvió el error. Esto significa que el servidor proxy tenía algún tipo de límite de tamaño establecido.

En una máquina que tiene acceso directo a Internet, el método de transferencia de archivos nunca dejó con este error, aunque sea por tamaño de la matriz> 16384.

Dado que sólo algunos de sus clientes se enfrentan a este problema, posiblemente están detrás de un firewall/servidor proxy que es el que realmente bloquea el acceso y devuelve este error?

+0

Lo mismo aquí. Olvidé verificar el servidor proxy de omisión para las direcciones locales – AlexDev

Cuestiones relacionadas