Implementar seguridad en Servicio Web C#

Los encabezados SOAP nos dan un método para pasar datos a un método de Web Service XML y obtener datos del mismo, siempre y cuando los datos no sean usados en la funcionalidad principal del método. En esta entrada vamos a ver como implementar una solución para brindar seguridad a nuestros Web Services realizados en la plataforma .NET.

Para entender un poco mas a lo que llegaremos veamos que nos dice MSDN sobre SoapHeader: La comunicación con un método de servicio Web XML mediante SOAP sigue un formato estándar. Parte de este formato son los datos que se codifican en un documento XML. El documento XML consta de una etiqueta Envelope que, a su vez, consta de un elemento requerido Body y un elemento opcional Header. El elemento Body incluye los datos específicos del mensaje. El elemento opcional Header puede contener información adicional no relacionada directamente con el mensaje específico. Cada elemento secundario del elemento Header se denomina encabezado SOAP.

Vamos a darle un poco de seguridad al método mas difundido y conocido por todos HelloWorld().

Primero vamos a crear un proyecto de tipo web. en el vamos a crear un clase, esta va a representar los parámetros del encabezado soap, en nuestro caso el nombre de usuario y la clave. Esta clase va ha derivar de la SoapHeader perteneciente a el espacio de nombre System.Web.Services.Protocols

    /// <summary>
    /// Clase que se encarga de contener las credenciales de autenticación: Usuario y Clave
    /// </summary>
    public class Autenticacion : SoapHeader
    {
        private string sUserPass;
        private string sUserName;

        /// <summary>
        /// Lee o escribe la clave del usuario
        /// </summary>
        public string UsuarioClave
        {
            get
            {
                return sUserPass;
            }
            set
            {
                sUserPass = value;
            }
        }

        /// <summary>
        /// Lee o escribe el nombre del usuario
        /// </summary>
        public string UsuarioNombre
        {
            get
            {
                return sUserName;
            }
            set
            {
                sUserName = value;
            }
        }
    }


Luego creamos la clase ServicioSeguro que va a contener una referencia a la clase Autenticacion en conclusión va a tener la información del usuario. Esta clase va a derivar de WebService que pertenece a el espacio de nombre System.Web.Services. De esta clase derivan todos nuestros Web Services

    /// <summary>
    /// Contiene la referencia a la clase Autenticacion
    /// </summary>
    public class ServicioSeguro : WebService
    {
        public Autenticacion CredencialAutenticacion;
    }


Luego agregamos un Web Service llamado wsSeguridad.asmx. Como ya les había recordado los web services que hacemos heredan de WebService. Cambiamos a que derive de la clase ServicioSeguro que creamos anteriormente, no perderemos la funcionalidad ya que esta clase deriva de WebService. Recordar que SoapHeader perteneciente a el espacio de nombre System.Web.Services.Protocols

    /// <summary>
    /// Servicio de prueba
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/SecureWebService/SecureWebService")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class wsSeguridad : ServicioSeguro
    {
        /// <summary>
        /// Metodo de prueba.
        /// </summary>
        /// <returns>"Hello World si esta autenticado y puede consumir el WS, NONOO si sus credenciales no son validas"</returns>
        [WebMethod, SoapHeader("CredencialAutenticacion")]
        public string HelloWorld()
        {
            if (VerificarPermisos(CredencialAutenticacion))
            {
                return "Hello World";
            }
            else
            {
                return "NONOO";
            }
        }
        public static Boolean VerificarPermisos(Autenticacion value)
        {
            if (value == null)
            {
                return false;
            }
            else
            {
                //Verifica los permiso Ej. Consulta a BD
                if (value.UsuarioNombre == "user" && value.UsuarioClave == "pwd")
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }


Ahora realicemos una pagina para probar la seguridad de nuestro servicio.

    public partial class pruebas : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                wsSeguridad ws = new wsSeguridad();

                Autenticacion auten = new Autenticacion();

                auten.UsuarioNombre = "user";
                auten.UsuarioClave = "pwd2";

                ws.CredencialAutenticacion = auten;

                Response.Write(ws.HelloWorld());
            }
        }
    }

Comentarios

Entradas populares