Joven hacker sonriendo

Definir autenticación en webservices

Nuestros ethical hackers explican como evitar vulnerabilidades de seguridad mediante la configuración segura de autenticación de usuarios en webservices programando en ASP.NET con el fin de mejorar significativamente la seguridad de la aplicación.

Necesidad

Autenticación en WebServices ASP.NET.

Contexto

A continuación se describe las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se tiene un Servicio Web desarrollado en ASP.NET V3.

  2. El Servicio Web contiene información sensible y debe ser asegurado.

Solución

Los Web Services son geniales. Son flexibles y cruzan las barreras de los lenguajes. Sin embargo, en la mayoría de los casos, asegurar la funcionalidad que un Web Service expone es muy útil.

Existen muchas formas de crear un mecanismo de autenticación para un Web Service, entre ellas se cuenta:

  • Pedir las credenciales de usuario para cada método (no recomendado).

  • Escribir un código de validación que deba ser llamado antes para proporcionar un token. Este token se enviaría con cada solicitud, y el Web Service tendría que validar el token. Este método requiere que los usuarios conozcan su API muy bien, y requeriría que se implementara una especie de máquina de estados, para mejorar aspectos tales como el tiempo límite del token, entre otros.

  • Requerir que el consumidor (por ejemplo, el browser), sea validado antes de acceder al Web Service.

En este caso realizaremos una autenticación de credenciales utilizando un token, haciendo uso del encabezado SOAP (SOAPHeader). Para ello, debemos seguir los siguientes pasos:

  1. Lo primero que debemos hacer es proporcionar una forma de aceptar las credenciales de autenticación. Realizamos esto al hacer que la cabecera SOAP sea requerida en todas las llamadas al Servicio Web Hello World. La cabecera SOAP es el lugar común donde se colocará la información de autenticación. Para validar la autenticación se utilizará un token de autenticación, el cual será accesible a través del método IsAuthenticated() [1].

  2. Para lograr que la cabecera web sea requerida en todos los llamados, creamos el objeto SecuredSoapHeader, lo instanciamos públicamente y le agregamos la directiva [SoapHeader] al método Hello World.

  3. Se procede a generar un token para que no sea necesario el ingreso de las credenciales en cada llamado al servicio Web. El método encargado de ello es AuthenticateUser().

  4. Agregamos un chequeo básico para asegurarnos de que la cabecera SOAP sea válida. Luego de esto, agregamos el método privado IsUserValid() para albergar la autenticación respectiva.

El siguiente código realiza el procedimiento anteriormente mencionado [2]:

SecuredWebServiceHeader.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace SecuredWebService
{
  /// <summary>
  /// Soap Header for the Secured Web Service.
  /// Username and Password are required for AuthenticateUser(),
  ///   and AuthenticatedToken is required for everything else.
  /// </summary>
  public class SecuredWebServiceHeader : System.Web.Services.Protocols.SoapHeader
  {
    public string Username;
    public string Password;
    public string AuthenticatedToken;
  }

  /// <summary>
  /// Summary description for SecuredWebService.
  /// </summary>
  [WebService(Namespace = "http://tempuri.org/")]
  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  [System.ComponentModel.ToolboxItem(false)]
  // To allow this Web Service to be called from script, using ASP.NET AJAX
  //uncomment the following line.
  // [System.Web.Script.Services.ScriptService]

  public class SecuredWebService : System.Web.Services.WebService
  {
    public SecuredWebServiceHeader SoapHeader;
    [WebMethod]
    [System.Web.Services.Protocols.SoapHeader("SoapHeader")]
    public string AuthenticateUser()
    {
      if (SoapHeader == null)
      return "Please provide a Username and Password";
      if (string.IsNullOrEmpty(SoapHeader.Username)||string.IsNullOrEmpty(SoapHeader.Password))
      return "Please provide a Username and Password";
      // Are the credentials valid?
      if (!IsUserValid(SoapHeader.Username, SoapHeader.Password))
        return "Invalid Username or Password";
      // Create and store the AuthenticatedToken before returning it.
      string token = Guid.NewGuid().ToString();
      HttpRuntime.Cache.Add(
        token,
        SoapHeader.Username,
        null,
        System.Web.Caching.Cache.NoAbsoluteExpiration,
        TimeSpan.FromMinutes(,System.Web.Caching.CacheItemPriority.NotRemovable,null);
        return token;
    }
    private bool IsUserValid(string Username, string Password)
    {
      return true;
    }
    [WebMethod]
    [System.Web.Services.Protocols.SoapHeader("SoapHeader")]
    public string HelloWorld()
    {
          return "Hello World";
    }
  }
}



Haz un comentario

Estado de los servicios - Términos de Uso