lunes, 30 de diciembre de 2013

ASP.NET - Web Services y Autenticacion mediante cabeceras SOAP

soapUna forma muy conveniente de autenticar a los usuarios que consumen un web service es usando cabeceras SOAP.

La ventaja que me brinda está modalidad es que no mezcla los parámetros que requiere el web service con los datos de autenticación del usuario que consume el web service.

No vayan a pensar que esto es algo nuevo, para nada, en realidad este es un tema bastante conocido, sin embargo hago el post porque necesité enviar un ejemplo de cómo operan las cabeceras SOAP, y es el pretexto perfecto para hacer un nuevo post para este blog que lo tengo tan olvidado.

Vamos con el ejemplo, para este caso he creado una solución con dos proyectos, el primero contiene un web service con dos métodos, uno no requiere autenticación y el otro sí.

El segundo proyecto contiene una página aspx que hace de cliente y consume al web service, para lo cual debe pasar el usuario, contraseña y ambiente que solicita la cabecera SOAP que implementé.

Cabe destacar que las cabeceras SOAP permiten crear la cantidad de elementos que Ud. considere necesario, es decir es una autenticación personalizada.

Vamos a continuar explicando conforme revisemos el código.

Empecemos revisando el primer proyecto, el cual contiene varias clases que trabajan con las cabeceras SOAP.

También en este proyecto está el web service. Un punto resaltante es que cada método que requiere autenticación debe ser decorado con los atributos SoapHeader y la clase personalizada que hay creado, en este caso cAuthenticationExtension:
    <cAuthenticationExtension()> <SoapHeader("Credentials")> <WebMethod()> _
    Public Function HelloWorld_YESHeaders(ByVal FullName As String) As String
        
        Return String.Format("Hello {0}", FullName)

    End Function

Si tengo métodos en el web service que no requieren autenticación, serán decorados sólo con WebMethod:
    <WebMethod()> _
    Public Function HelloWorld_NOHeaders(ByVal FullName As String) As String
        
        Return String.Format("Hello {0}", FullName)

    End Function

Luego, en el segundo proyecto, he añadido una página aspx, el cual consume los métodos del web service:

Obviamente, primero debo añadir una referencia a dicho web service, yo la he llamado Cabec_Soap_Referencia. Luego el código para consumir los métodos del web service sería:
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If IsPostBack Then Return

        'instanciamos el web service
        Dim wsx As New ws.WebService1

        'consumimos el método del web service que no requiere cabeceras SOAP
        Dim msg0 As String = wsx.HelloWorld_NOHeaders("Segundo Serrano")
        Response.Write("<br /><br />" & msg0)

        'Instanciamos la cabecera SOAP
        Dim myHeader As New ws.cAuthenticationHeader
        myHeader.UserName = "usuario1"
        myHeader.Password = "password1"
        myHeader.Ambiente = "TIENDAS EFE"

        'este método sí requiere cabeceras SOAP... si no pusiéramos esta línea, el método arrojaría error
        wsx.cAuthenticationHeaderValue = myHeader
        Dim msg1 As String = wsx.HelloWorld_YESHeaders("Segundo Serrano")
        Response.Write("<br /><br />" & msg1)

    End Sub
Les dejo el ejemplo completo.

Espero que les sea de utilidad Guiño

No hay comentarios.: