none
Consumir web service JAVA JAX-WS desde ASP .NET - usuario y contraseña no válidos RRS feed

  • Pregunta

  • Hola,

    Tengo que consumir un servicio web desarrollado en JAVA que implementa JAX-WS con Asp .Net importanto el mismo como Service Reference (WCF) y como Web Reference (ASMX) pero obtengo un error que me indica "Usuario y contraseña inválidos -  acceso denegado." (HRESULT = -2146233087). El servicio requiere autenticación HTTP básica (usuario y contraseña, sin dominio).

    Las credenciales son correctas ya que se están usando desde SoapUI y desde clientes J2EE. 

    Tengo creadas dos Class Library y en cada una he importado el servicio web de una forma (WCF o ASMX) y para probar las clases utilizo un aplicación de Windows Forms con dos botones.

    El código de la Clase ASMX es:

     Dim oCliente As WSProxyPVCE.ProxyImplService
                            oCliente = New WSProxyPVCE.ProxyImplService
                            oCliente.Url = URLWS
    
                            Dim credenciales As ICredentials
                            credenciales = New NetworkCredential(usuario, password)
                            oCliente.Credentials = credenciales
                            oCliente.PreAuthenticate = True
    
                            'Dim objHTTP As HttpWebRequest = CType(WebRequest.Create(URLWS), HttpWebRequest)
                            'objHTTP.Proxy = New WebProxy()
                            'objHTTP.Proxy.Credentials = credenciales
                            'objHTTP.Credentials = credenciales
                            'WebRequest.DefaultWebProxy = objHTTP.Proxy
    
                            Dim oRespuesta As WSProxyPVCE.responseValida
                            oRespuesta = oCliente.validaCert(stringToByteArray(Datos), idPolitica)

    El código de la clase WCF es:

                            Dim oCliente As WSProxy.ProxyImplClient
                            httpBinding = oBindings.CreateBasicHttpBinding()
                            address = oBindings.CreateEndPoint(URLWS)
    
                            oCliente = New WSProxy.ProxyImplClient(httpBinding, address)
    
                            oCliente.ClientCredentials.UserName.UserName = usuario
                            oCliente.ClientCredentials.UserName.Password = password
    
                            Dim oRespuesta As WSProxy.responseValida
                            oRespuesta = oCliente.validaCert(stringToByteArray(Datos), idPolitica)

    Que utiliza las siguientes funciones para configurar el cliente del servicio web.

            Public Function CreateBasicHttpBinding() As BasicHttpBinding
                Dim binding As New BasicHttpBinding()
    
    
                ' Binding
                binding.Name = "ProxyImplServiceSoapBinding"
    
                binding.CloseTimeout = New TimeSpan(0, 1, 0)
                binding.OpenTimeout = New TimeSpan(0, 1, 0)
                binding.ReceiveTimeout = New TimeSpan(0, 10, 0)
                binding.SendTimeout = New TimeSpan(0, 10, 0)
    
                binding.AllowCookies = False
    
                binding.BypassProxyOnLocal = False
                binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard
                binding.MaxBufferSize = 65536000
                binding.MaxBufferPoolSize = 524288000
                binding.MaxReceivedMessageSize = 65536000
                binding.MessageEncoding = WSMessageEncoding.Text
                binding.TextEncoding = Text.Encoding.UTF8
                binding.TransferMode = TransferMode.Buffered
                binding.UseDefaultWebProxy = True
    
                ' Binding, readerQuotas
                binding.ReaderQuotas.MaxDepth = 32
                binding.ReaderQuotas.MaxStringContentLength = 8192
                binding.ReaderQuotas.MaxArrayLength = 16384000
                binding.ReaderQuotas.MaxBytesPerRead = 4096
                binding.ReaderQuotas.MaxNameTableCharCount = 16384
    
                ' Binding, security
                binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly
    
                ' Binding, security, transport
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic
                binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None
                binding.Security.Transport.Realm = ""
    
                ' Binding, security, message
                binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName
                binding.Security.Message.AlgorithmSuite = Security.SecurityAlgorithmSuite.Default
    
                ' Binding, security, Mode
                binding.Security.Mode = BasicHttpSecurityMode.None
    
                Return binding
            End Function
    
            Public Function CreateEndPoint(ByVal url As String) As EndpointAddress
                Return New EndpointAddress(url)
            End Function


    El problema es como si no se recuperara la cabecera soap por el Web Service. ¿Qué me puede faltar por configurar?

    Muchas Gracias,

    Pablo.


    Regards, Pablo Martín Gutierrez.

    jueves, 20 de marzo de 2014 17:33

Respuestas

  • Hola,

    He conseguido validar las comunicaciones para el servicio web importado como ASMX.

    He tenido que insertar directamente la cabecera SOAP Http Basic interceptando un método. Es lo siguiente.

        Partial Public Class ProxyImplService
            Inherits System.Web.Services.Protocols.SoapHttpClientProtocol
            Protected Overrides Function GetWebRequest(ByVal myUri As Uri) As System.Net.WebRequest
                Dim request As System.Net.HttpWebRequest
                request = CType(MyBase.GetWebRequest(myUri), System.Net.HttpWebRequest)
    
                If Me.PreAuthenticate Then
                    Dim creds As System.Net.NetworkCredential = Me.Credentials.GetCredential(myUri, "Basic")
                    If Not creds Is Nothing Then
                        Dim credentialBuffer() As Byte = New System.Text.UTF8Encoding().GetBytes(String.Concat(creds.UserName, ":", creds.Password))
                        request.Headers("Authorization") = String.Concat("Basic ", Convert.ToBase64String(credentialBuffer))
                    Else
                        Throw New ApplicationException("No se han incluído credenciales de acceso ")
                    End If
                End If
                Return request
            End Function
        End Class
    Además en la llamada he modificado el método a:
                            Dim oCliente As WSProxyPVCE.ProxyImplService
                            oCliente = New WSProxyPVCE.ProxyImplService
                            oCliente.Url = URLWS
    
                            Dim credenciales As  New NetworkCredential(usuario, password, domain)
                            Dim CacheCredenciales As New CredentialCache()
                            CacheCredenciales.Add(New Uri(oCliente.Url), "Basic", credenciales)
    
                            oCliente.PreAuthenticate = True
                            oCliente.UseDefaultCredentials = False                     
                            oCliente.Credentials = CacheCredenciales
    
                            Dim oRespuesta As WSProxyPVCE.responseValida
                            oRespuesta = oCliente.valida(Datos, id)

    Para WCF aún lo tengo pendiente.

    Saludos,

    Pablo.



    Regards, Pablo Martín Gutierrez.


    • Editado Blonix viernes, 21 de marzo de 2014 12:13 Error de copiado
    • Marcado como respuesta Blonix viernes, 21 de marzo de 2014 13:45
    viernes, 21 de marzo de 2014 12:07
  • Hola,

    Conseguido, he tenido que hacer lo mismo pero para WCF. El código resultante para la llamada al servicio es:

                            Dim httpRequestProperty As New HttpRequestMessageProperty()
                            Dim credentialBuffer() As Byte = New System.Text.UTF8Encoding().GetBytes(String.Concat(usuario, ":", password))
                            Dim auth As String = String.Concat("Basic ", Convert.ToBase64String(credentialBuffer))
    
                            httpRequestProperty.Headers(HttpRequestHeader.Authorization) = auth
    
                            Using scope As New OperationContextScope(oCliente.InnerChannel)
                                OperationContext.Current.OutgoingMessageProperties(HttpRequestMessageProperty.Name) = httpRequestProperty
                                oRespuesta = oCliente.valida(Datos, id)
                            End Using

    Saludos,


    Regards, Pablo Martín Gutierrez.

    • Marcado como respuesta Blonix viernes, 21 de marzo de 2014 13:45
    viernes, 21 de marzo de 2014 13:44

Todas las respuestas

  • Hola,

    He conseguido validar las comunicaciones para el servicio web importado como ASMX.

    He tenido que insertar directamente la cabecera SOAP Http Basic interceptando un método. Es lo siguiente.

        Partial Public Class ProxyImplService
            Inherits System.Web.Services.Protocols.SoapHttpClientProtocol
            Protected Overrides Function GetWebRequest(ByVal myUri As Uri) As System.Net.WebRequest
                Dim request As System.Net.HttpWebRequest
                request = CType(MyBase.GetWebRequest(myUri), System.Net.HttpWebRequest)
    
                If Me.PreAuthenticate Then
                    Dim creds As System.Net.NetworkCredential = Me.Credentials.GetCredential(myUri, "Basic")
                    If Not creds Is Nothing Then
                        Dim credentialBuffer() As Byte = New System.Text.UTF8Encoding().GetBytes(String.Concat(creds.UserName, ":", creds.Password))
                        request.Headers("Authorization") = String.Concat("Basic ", Convert.ToBase64String(credentialBuffer))
                    Else
                        Throw New ApplicationException("No se han incluído credenciales de acceso ")
                    End If
                End If
                Return request
            End Function
        End Class
    Además en la llamada he modificado el método a:
                            Dim oCliente As WSProxyPVCE.ProxyImplService
                            oCliente = New WSProxyPVCE.ProxyImplService
                            oCliente.Url = URLWS
    
                            Dim credenciales As  New NetworkCredential(usuario, password, domain)
                            Dim CacheCredenciales As New CredentialCache()
                            CacheCredenciales.Add(New Uri(oCliente.Url), "Basic", credenciales)
    
                            oCliente.PreAuthenticate = True
                            oCliente.UseDefaultCredentials = False                     
                            oCliente.Credentials = CacheCredenciales
    
                            Dim oRespuesta As WSProxyPVCE.responseValida
                            oRespuesta = oCliente.valida(Datos, id)

    Para WCF aún lo tengo pendiente.

    Saludos,

    Pablo.



    Regards, Pablo Martín Gutierrez.


    • Editado Blonix viernes, 21 de marzo de 2014 12:13 Error de copiado
    • Marcado como respuesta Blonix viernes, 21 de marzo de 2014 13:45
    viernes, 21 de marzo de 2014 12:07
  • Hola,

    Conseguido, he tenido que hacer lo mismo pero para WCF. El código resultante para la llamada al servicio es:

                            Dim httpRequestProperty As New HttpRequestMessageProperty()
                            Dim credentialBuffer() As Byte = New System.Text.UTF8Encoding().GetBytes(String.Concat(usuario, ":", password))
                            Dim auth As String = String.Concat("Basic ", Convert.ToBase64String(credentialBuffer))
    
                            httpRequestProperty.Headers(HttpRequestHeader.Authorization) = auth
    
                            Using scope As New OperationContextScope(oCliente.InnerChannel)
                                OperationContext.Current.OutgoingMessageProperties(HttpRequestMessageProperty.Name) = httpRequestProperty
                                oRespuesta = oCliente.valida(Datos, id)
                            End Using

    Saludos,


    Regards, Pablo Martín Gutierrez.

    • Marcado como respuesta Blonix viernes, 21 de marzo de 2014 13:45
    viernes, 21 de marzo de 2014 13:44
  • Hola 

    Alguien me puede a consumir un web service con credenciales y de tipo "Basic", en WCF.

    He tratado pero me marca el siguiente error:

    The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm="My Realm"'.

    Me podria  ayudar, es la primera ves que trabajo con un WCF

    miércoles, 28 de mayo de 2014 20:22