SoapHeader, SoapExtensions y Herencia
Hace unos dÃas Jordi escribió sobre las SoapExtensions y yo sobre las SoapHeaders, hoy le añadimos herencia y vemos como ahorrarnos bastante código y trabajo en una capa de servicios.
La idea es que todos los métodos de todos los servicios web de la aplicación se autentifiquen en el mismo sitio y no tener que poner el código de autentificación en cada método, además no queremos usar cookies ni mantenimiento de sesión.
Para esto usaremos una Cabecera Soap donde el cliente nos enviara Usuario y Contraseña, debemos crear la clase cabecera:
public class SoapHeaderCredentials : SoapHeader
{
public string Password = "";
public string UserName = "";
}
Cada servicio web tiene que tener una propiedad con la Cabecera, para ahorrarnos el escribirlo cada vez, creamos una clase que herede de WebService, que contenga la propiedad y heredamos los servicios web de esa clase:
public class MyWebService : System.Web.Services.WebService { public SoapHeaderCredentials soapHeaderCredentials; }
public class Service : MyWebService
Después creamos una Extensión Soap de autentificación (en este caso la llamamos AuthenticationExtension), Jordi ya explica aquà como crearlas asà que solo pongo el código que nos interesa, que es donde buscamos la Cabecera Soap en el Método ProcessMessage:
case SoapMessageStage.AfterDeserialize: { var o = from h in message.Headers.Cast<SoapHeader>() where h.GetType() == typeof(SoapHeaderCredentials) select h ; SoapHeaderCredentials soapHeaderCredentials = (SoapHeaderCredentials) o.First(); AuthenticateUser( new Credentials() { UserName = soapHeaderCredentials.UserName, Password = soapHeaderCredentials.Password, },
);
break;
}
Después solo queda añadir los dos atributos [SoapHeader("soapHeaderCredentials")] y [AuthenticationExtension()] a nuestros WebMethods, eso hará que los métodos tengan la cabecera de usuario y contraseña y que ejecuten el código de autentificación al recibir un mensaje:
[WebMethod] [SoapHeader("soapHeaderCredentials")] [AuthenticationExtension()] public string HelloWorld() { return "Hello World"; }
Y listo


