Compartir a través de


Proteger servicios Web XML creados mediante ASP.NET

Para decidir qué implementación de seguridad es la mejor para un servicio Web XML, se debe comenzar por la consideración de dos principios de seguridad clave: la autenticación y la autorización. La autenticación es un proceso que consiste en validar una identidad en función de las credenciales, como el nombre de usuario y la contraseña, con respecto a una autoridad determinada. Una vez autenticada la identidad, la autorización determina si esa identidad está autorizada para obtener acceso a un recurso.

En la seguridad de los servicios Web XML creados mediante ASP.NET se puede elegir entre las opciones de autenticación y autorización que ofrece ASP.NET o la seguridad personalizada basada en SOAP. ASP.NET funciona en combinación con Servicios de Internet Information Server (IIS) para proporcionar varias opciones de autenticación y autorización. También es posible crear opciones de autenticación personalizadas, como el uso de encabezados SOAP. Además, ASP.NET ofrece la capacidad para ejecutar una solicitud con las credenciales del cliente, lo que se denomina "representación". Para obtener más información sobre cómo usar la suplantación, vea Representación de ASP.NET.

En este tema se resumen las opciones de autenticación y autorización que están disponibles para los servicios Web XML creados mediante ASP.NET. Para obtener información completa acerca de las opciones de seguridad disponibles para las aplicaciones Web de ASP.NET, vea Proteger aplicaciones Web de ASP.NET.

Opciones de autenticación para servicios Web XML

Los servicios Web XML creados mediante ASP.NET disponen de varias opciones para la autenticación de clientes, por lo que lo más difícil es decidir cuál es la más apropiada para un servicio Web XML específico. Para elegir la opción de seguridad correcta, una de las decisiones que debe tomar el programador es el nivel de seguridad y rendimiento. En algunos servicios Web XML, es fundamental que las credenciales de los clientes se envíen de forma segura a través de la red, por lo que resulta esencial disponer de un algoritmo que cifre las credenciales de los clientes. Por ejemplo, al crear un servicio Web XML que procese tarjetas de crédito, el programador probablemente estará más preocupado por que las credenciales de los clientes puedan ser robadas que por la carga adicional que impone el cifrado de la información de las tarjetas de crédito.

En la tabla siguiente se resumen las opciones de autenticación que están disponibles para los servicios Web XML creados mediante ASP.NET. Las opciones que llevan delante la palabra Windows forman parte de las opciones de autenticación de Microsoft Windows que están disponibles para los servicios Web XML creados mediante ASP.NET.

Resumen de las opciones de autenticación

Opción de autenticación Descripción
Windows: básica Puede utilizarse para la identificación no segura de los clientes, puesto que el nombre de usuario y la contraseña se envían en cadenas de texto sin cifrar codificadas en base 64. En este tipo de autenticación, las contraseñas y los nombres de usuario se codifican pero no se cifran. Un usuario informático con intenciones maliciosas que disponga de una herramienta de supervisión de red puede interceptar los nombres de usuario y las contraseñas.
Windows: básica sobre SSL Puede utilizarse para la identificación segura de clientes en escenarios de Internet. El nombre de usuario y la contraseña se envían a través de la red con cifrado SSL (Secure Sockets Layer, Nivel de sockets seguros), en lugar de como texto sin cifrar. Es relativamente sencillo de configurar y eficaz para escenarios de Internet. Sin embargo, el uso de SSL reduce el rendimiento.
Windows: implícita Puede utilizarse para la identificación segura de clientes en escenarios de Internet. Utiliza hash para transmitir las credenciales de los clientes de forma segura ya que la contraseña no se transmite en texto sin cifrar. Además, la autenticación implícita puede funcionar a través de servidores proxy. Sin embargo, no se admite en muchas plataformas.
Windows: integrada de Windows Utiliza NTLM o Kerberos. Utiliza un intercambio criptográfico con el explorador Web Microsoft Internet Explorer del usuario.
Windows: certificados de cliente Puede utilizarse para la identificación segura de clientes en escenarios de Internet y de intranet. Requiere que cada cliente obtenga un certificado de una entidad emisora de certificados de confianza mutua. Opcionalmente, los certificados se asignan a cuentas de usuario, que IIS utiliza para autorizar el acceso al servicio Web XML.
Forms No se admite en los servicios Web XML. Se trata de un sistema que redirige las solicitudes no autenticadas a un formulario HTML mediante redirección en el cliente HTTP. La mayoría de los clientes de servicios Web XML no desearán proporcionar credenciales mediante una IU. Se debe proporcionar una alternativa para no usar esta opción con el fin de evitar el formulario de inicio de sesión.
Encabezados SOAP: personalizada Puede utilizarse para escenarios de Internet seguros y no seguros. Las credenciales de los usuarios se pasan en el encabezado SOAP del mensaje SOAP. Con independencia de la plataforma que aloje el servicio Web XML, el servidor Web proporciona una implementación de autenticación personalizada.

En todas las opciones enumeradas anteriormente, excepto en el uso de los encabezados SOAP, la configuración de la seguridad se especifica mediante una combinación de archivos de configuración e IIS. Para obtener más información acerca de los archivos de configuración, vea Configuración de ASP.NET. La opción de encabezados SOAP personalizados se detalla a continuación de la sección acerca de la autorización, puesto que esta solución incluye la autenticación y la autorización.

Autenticación de Windows

IIS y ASP.NET proporcionan compatibilidad con la autenticación de aplicaciones Web, lo que incluye los servicios Web XML, mediante la seguridad integrada de Windows. Windows ofrece tres opciones de autenticación: básica, implícita e integrada de Windows. Además, cada una de estas opciones se puede utilizar con SSL. Como todas las opciones de autenticación de Windows, excepto la básica, cifran los datos de alguna forma, el grado adicional de cifrado que ofrece SSL sólo se suele usar en combinación con la autenticación básica o los certificados de cliente.

Con independencia de la opción de autenticación de Windows utilizada, la configuración del servicio Web XML y el cliente de servicios Web XML es similar. El uso de certificados de cliente es una excepción, por lo que más adelante se explican por separado los pasos para configurar el servidor y el cliente con el fin de utilizar esta opción. No es necesario agregar código a un servicio Web XML para utilizar la autenticación de Windows, puesto que estas opciones se establecen en un archivo de configuración y en IIS. Para pasar las credenciales de los clientes al servicio Web XML, se debe agregar código a un cliente de servicios Web XML.

Si se elige SSL como parte del mecanismo de autenticación utilizado en un servicio Web XML, SSL deberá configurarse para la aplicación Web que aloje el servicio Web XML o para el propio servicio Web XML, mediante IIS. En la descripción de servicio y, por lo tanto, en las clases de proxy generadas a partir de ella se reflejará que el servicio Web XML utiliza SSL (si se tiene acceso mediante SSL a la descripción de servicio y a la página de ayuda del servicio). En la descripción de servicio, la dirección URL del servicio Web XML irá precedida de https. Para obtener más información sobre cómo configurar SSL, consulte la documentación de IIS.

Para configurar el servicio Web XML para la autenticación de Windows

  1. Configure el servicio Web XML para utilizar la autenticación de Windows, mediante IIS.

    IIS permite especificar seguridad en los directorios o archivos. Si desea especificar la seguridad para cada archivo en un servicio Web XML, establezca los permisos para el servicio en el archivo .asmx en IIS. El archivo .asmx es el punto de entrada al servicio Web XML. Para obtener más información, consulte la documentación de IIS.

  2. Modifique el archivo de configuración para especificar la autenticación de Windows.

    Establezca en "Windows" el valor del atributo mode del elemento XML authentication del archivo de configuración. Para obtener más información sobre cómo configurar un archivo de configuración, vea Configuración de ASP.NET. En el ejemplo de código siguiente se modifica un archivo de configuración para utilizar la autenticación de Windows.

    // Fragment of a Web.config file.
    <authentication mode= "Windows">
    </authentication> 
    

Para pasar las credenciales de los clientes a un servicio Web XML mediante la autenticación de Windows

  1. Cree una instancia nueva de la clase de proxy en el servicio Web XML. Si no se ha generado una clase de proxy, vea Crear un proxy de servicio Web XML para obtener más información.

  2. Cree una instancia nueva de la clase NetworkCredential, donde se establezcan las propiedades UserName, Password y Domain.

  3. Cree una instancia nueva de CredentialCache.

  4. Agregue la clase NetworkCredential a CredentialCache mediante el método Add de CredentialCache.

  5. Asigne la instancia de CredentialCache a la propiedad Credentials de la clase de proxy.

    Si se utiliza la autenticación integrada de Windows, debe establecer la propiedad Credentials a DefaultCredentials.

    Cuando se establece la propiedad Credentials en CredentialCache.DefaultCredentials, el cliente negocia con el servidor una autenticación Kerberos o NTLM dependiendo de cómo esté configurado el servidor.

    En el ejemplo de código siguiente se establecen las credenciales de cliente que se pasan a un método de servicio Web XML mediante la autenticación de Windows.

    Imports System
    Imports System.Web.Services.Protocols
    Imports System.Net
    Imports MyMath
    
    Public Class Calculator
       Public Shared Sub Main()
         ' Create a new instance of the proxy class to an
         ' XML Web service method. 
         Dim mathproxy As MyMath.Math = New MyMath.Math()
    
         ' Create a new instance of CredentialCache.
         Dim mycredentialCache As CredentialCache = New CredentialCache()
    
         ' Create a new instance of NetworkCredential using the client
         ' credentials.
           Dim credentials As NetworkCredential = New _          NetworkCredential(UserName,SecurelyStoredPasword,Domain)
    
         ' Add the NetworkCredential to the CredentialCache.
           mycredentialCache.Add(New Uri(mathproxy.Url), "Basic", _                             credentials)
    
         ' Add the CredentialCache to the proxy class credentials.
         mathproxy.Credentials = mycredentialCache
    
         ' Call the method on the proxy class.
         Dim result As Integer 
         result = mathproxy.Add(3,5)
      End Sub
    End Class 
    [C#]
    using System;
    using System.Web.Services.Protocols;
    using System.Net;
    using MyMath;
    
    public class Calculator
    {
      public static void Main() 
      {
         // Create a new instance of the proxy class to an XML
         // Web service method. 
         MyMath.Math math = new MyMath.Math();
    
        // Create a new instance of CredentialCache.
        CredentialCache credentialCache = new CredentialCache();
    
       // Create a new instance of NetworkCredential using the client
       // credentials.
       NetworkCredential credentials = new
          NetworkCredential(UserName,SecurelyStroredPassword,Domain);
    
       // Add the NetworkCredential to the CredentialCache.
       credentialCache.Add(new Uri(math.Url),                        "Basic", credentials);
    
       // Add the CredentialCache to the proxy class credentials.
       math.Credentials = credentialCache;
    
         // Call the method on the proxy class.
         int result = math.Add(3,5);
      }
    }
    

Autenticación mediante certificados de cliente

Los certificados de cliente proporcionan un mecanismo seguro de autenticación, puesto que se requiere que los clientes envíen, mediante una conexión SSL con el servidor Web, un documento electrónico, denominado certificado de cliente, en el que se identifica un cliente. La conexión SSL asegura que las credenciales del cliente contenidas en el certificado se cifran al enviarse a través de la red. La comunicación entre el cliente y el servidor Web se cifra mediante una combinación de las claves de cifrado enviadas por el cliente y las claves que proporciona el servidor Web. Después de establecerse la comunicación, sólo los equipos cliente y servidor se pueden comunicar entre sí mediante dicha conexión SSL.

El certificado de cliente se puede obtener en una entidad emisora de certificados, que puede ser el propio servidor Web o una compañía de confianza que sirva de intermediario entre el cliente y el servidor. Una vez que se ha obtenido el certificado y se ha configurado el servidor Web para aceptar certificados de cliente, el cliente puede enviar el certificado al servidor Web a través de una conexión SSL cuando se llama a un servicio Web XML. Para obtener más información acerca de los certificados del cliente, vea la documentación de IIS.

Para configurar el servicio Web XML para la autenticación mediante certificados de cliente

Los pasos enumerados a continuación son una introducción a la forma de configurar IIS para autenticar clientes mediante certificados. Para obtener más información, consulte la documentación de IIS.

  1. Instale SSL.

  2. Configure la aplicación Web para que acepte certificados de cliente.

  3. Modifique el archivo de configuración para especificar la autenticación de Windows para el servicio Web XML.

    Establezca en "Windows" el valor del atributo mode del elemento XML authentication del archivo de configuración. Para obtener más información sobre cómo configurar un archivo de configuración, vea Configuración de ASP.NET. En el ejemplo de código siguiente se modifica un archivo de configuración para utilizar la autenticación de Windows.

    // Fragment of a Web.config file.
    <authentication mode= "Windows">
    </authentication>
    

Para pasar las credenciales de los clientes a un servicio Web XML mediante la autenticación de Windows

  1. Cree una instancia nueva de la clase de proxy en el servicio Web XML. Si no se ha generado una clase de proxy, vea Crear un proxy de servicio Web XML para obtener más información.

  2. Cree una instancia nueva de X509Certificate.

  3. Llame al método CreateFromCertFile para cargar el certificado de cliente desde un archivo.

    Un cliente puede obtener un archivo de certificado de cliente en una entidad emisora de certificados de confianza. Para obtener más información, consulte la documentación de IIS.

  4. Agregue X509Certificate a la colección ClientCertificates de la clase de proxy.

    En el ejemplo de código siguiente se muestra cómo un cliente de servicios Web XML pasa sus credenciales mediante un certificado de cliente. Un certificado de cliente emitido por el servidor Web se carga desde un archivo con el método CreateFromCertFile y, después, se agrega a la propiedad ClientCertificates de la clase de proxy.

    ' Instantiate proxy class to a Bank XML Web service.
    Dim bank As BankSession = new BankSession()
    
    ' Load the client certificate from a file.
    Dim x509 As X509Certificate = X509Certificate.CreateFromCertFile("c:\user.cer")
    
    ' Add the client certificate to the ClientCertificates property
    ' of the proxy class.
    bank.ClientCertificates.Add(x509)
    
    ' Call the method on the proxy class, which requires authentication
    ' using client certificates.
    bank.Deposit(500)
    [C#]
    // Instantiate proxy class to a Bank XML Web service.
    BankSession bank = new BankSession();
    
    // Load the client certificate from a file.
    X509Certificate x509 = X509Certificate.CreateFromCertFile(@"c:\user.cer");
    
    // Add the client certificate to the ClientCertificates property
    // of the proxy class.
    bank.ClientCertificates.Add(x509);
    
    // Call the method on the proxy class, which requires
    // authentication using client certificates.
    bank.Deposit(500);
    

Opciones de autorización para servicios Web XML

La finalidad del proceso de autorización es determinar si se debe conceder el acceso a un recurso dado a la identidad que lo solicita. Hay dos formas básicas de autorizar el acceso a un recurso dado: autorización de archivo y autorización de dirección URL. La autorización de archivo se puede utilizar cuando se usa la autenticación de Windows, puesto que los permisos en IIS se configuran para cada archivo. La autorización de dirección URL se puede utilizar con cualquier mecanismo de autenticación que sea compatible con ASP.NET. Con la autorización de dirección URL la configuración se realiza mediante un archivo de configuración, en el que se puede conceder o denegar de forma selectiva el acceso de los usuarios a los archivos asociados con ASP.NET, incluidos los archivos .asmx.

Para obtener más información sobre cómo configurar la autorización por archivo, consulte la documentación de IIS.

Para obtener más información sobre cómo configurar la autorización mediante un archivo de configuración, vea Autorización de ASP.NET.

Encabezados SOAP: solución personalizada

Los mecanismos de autenticación de Windows, incluidos los certificados de cliente, dependen del transporte HTTP, mientras que SOAP es independiente del transporte. Los servicios Web XML creados mediante ASP.NET utilizan SOAP sobre HTTP. Por ello, una de las razones para crear un mecanismo de autenticación personalizado es separar la autenticación del transporte. Esto se logra al pasar las credenciales de autenticación en el encabezado SOAP.

Los encabezados SOAP son muy útiles para pasar datos fuera de banda o información no relacionada con la semántica de un servicio Web XML. A diferencia del elemento Body de un mensaje SOAP, que incluye los parámetros in y out del método de servicio Web XML, con lo que éste los procesa, el elemento Header es opcional y puede ser procesado por la infraestructura. Esto significa que lo procesa la infraestructura desarrollada para proporcionar un mecanismo personalizado de autenticación.

La siguiente solución personalizada se crea mediante ASP.NET para proporcionar un mecanismo de autenticación que utiliza encabezados SOAP. Los pasos para crear la solución son los siguientes:

  • Se crea un elemento HTTP Module personalizado que se ejecuta en el servidor Web donde se alojan los servicios Web XML.
  • El elemento HTTP Module analiza los mensajes HTTP para comprobar si son mensajes SOAP.
  • Si detecta un mensaje SOAP, el elemento HTTP Module lee los encabezados SOAP.
  • Si el mensaje tiene credenciales de autenticación en el encabezado SOAP, el elemento HTTP Module inicia un evento global.asax personalizado.

Para modificar el servicio Web XML para que utilice la autenticación personalizada de encabezados SOAP, el servicio Web XML debe seguir dos pasos: por un lado, especificar que espera recibir el encabezado SOAP que contiene las credenciales de autenticación y, por otro, autorizar el acceso del cliente al servicio Web XML. En el ejemplo proporcionado el elemento HTTP Module autentica el usuario y establece las propiedades Context que un servicio Web XML puede utilizar para decidir si el cliente tiene autorización para obtener acceso al servicio Web XML.

Después, para enviar sus credenciales al servicio Web XML, los clientes de servicios Web XML agregan el encabezado SOAP esperado a la solicitud SOAP y lo llenan con las credenciales del cliente. Es importante observar que, en este ejemplo, el texto se envía a través de la red de forma claramente legible (no es seguro). Si el texto sin cifrar no es suficientemente seguro para la aplicación, agregue un algoritmo de cifrado.

El ejemplo de código siguiente contiene un elemento HTTP Module que analiza mensajes HTTP en busca de solicitudes SOAP. Si el mensaje HTTP es un mensaje SOAP, se inicia el evento personalizado WebServiceAuthenticationEvent.

using System;
using System.Web;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Text;
using System.Web.Services.Protocols;

namespace Microsoft.WebServices.Security {

      public sealed class WebServiceAuthenticationModule : IHttpModule 
      {
         private WebServiceAuthenticationEventHandler 
                       _eventHandler = null;

         public event WebServiceAuthenticationEventHandler Authenticate 
         {
           add { _eventHandler += value;}
           remove {_eventHandler -= value;}
         }
 
         public void Dispose() 
         {
         }

         public void Init(HttpApplication app) 
         {
           app.AuthenticateRequest += new
                      EventHandler(this.OnEnter);
         }

         private void OnAuthenticate(WebServiceAuthenticationEvent e) 
         {
           if (_eventHandler == null)
               return;

             _eventHandler(this, e);
             if (e.User != null)
                e.Context.User = e.Principal;
         }

         public string ModuleName
         {
           get{ return "WebServiceAuthentication"; }
         }

         void OnEnter(Object source, EventArgs eventArgs) {
           HttpApplication app = (HttpApplication)source;
           HttpContext context = app.Context;
           Stream HttpStream = context.Request.InputStream;

           // Save the current position of stream.
           long posStream = HttpStream.Position;

           // If the request contains an HTTP_SOAPACTION 
           // header, look at this message.
           if (context.Request.ServerVariables["HTTP_SOAPACTION"]                          == null)
              return;

           // Load the body of the HTTP message
           // into an XML document.
           XmlDocument dom = new XmlDocument();
           string soapUser;
           string soapPassword;

           try 
           {
             dom.Load(HttpStream);

             // Reset the stream position.
             HttpStream.Position = posStream;

             // Bind to the Authentication header.
             soapUser =
                 dom.GetElementsByTagName("User").Item(0).InnerText;
             soapPassword =
                 dom.GetElementsByTagName("Password").Item(0).InnerText;
           } 
           catch (Exception e) 
           {
             // Reset the position of stream.
             HttpStream.Position = posStream;

             // Throw a SOAP exception.
             XmlQualifiedName name = new
                          XmlQualifiedName("Load");
             SoapException soapException = new SoapException(
                       "Unable to read SOAP request", name, e);
             throw soapException;
           }

           // Raise the custom global.asax event.
           OnAuthenticate(new WebServiceAuthenticationEvent                        (context, soapUser, soapPassword));
           return;
      }
    }
}

El ejemplo de código siguiente contiene el evento de autenticación personalizado iniciado por el elemento HTTP Module si se recibe una solicitud SOAP.

namespace Microsoft.WebServices.Security {
    using System;
    using System.Web;
    using System.Security.Principal;

    public class WebServiceAuthenticationEvent : EventArgs {
       private Iprincipal _IPrincipalUser;
       private HttpContext _Context;
       private string _User;
       private string _Password;

       public WebServiceAuthenticationEvent(HttpContext context)
       {
            _Context = context;
       }

       public WebServiceAuthenticationEvent(HttpContext context,
                       string user, string password)
       {
           _Context = context;
           _User = user;
           _Password = password;
       }
       public  HttpContext Context 
       { 
         get { return _Context;}
       }
       public IPrincipal Principal 
       { 
         get { return _IPrincipalUser;} 
         set { _IPrincipalUser = value;}
       }
       public void Authenticate()
       {
         GenericIdentity i = new GenericIdentity(User);
         this.Principal = new GenericPrincipal(i, new String[0]);
       }
       public void Authenticate(string[] roles)
       {
         GenericIdentity i = new GenericIdentity(User);
         this.Principal = new GenericPrincipal(i, roles);
       }
       public string User 
       {
         get { return _User; }
         set { _User = value; }
       }
       public string Password
       {
         get { return _Password; }
         set { _Password = value; }
       }
       public bool HasCredentials {
         get 
         {
              if ((_User == null) || (_Password == null))
                return false;
              return true;
         }
       }
    }
}

El ejemplo de código siguiente contiene el delegado para el evento personalizado WebServiceAuthenticationEvent.

namespace Microsoft.WebServices.Security 
{
   using System;

   public delegate void WebServiceAuthenticationEventHandler(Object sender,  WebServiceAuthenticationEvent e);
}

El ejemplo de código siguiente contiene un servicio Web XML en el que se define el encabezado SOAP Authentication que debe pasar un cliente. El servicio Web XML no tiene que llevar a cabo la autenticación. En su lugar, puede inspeccionar la propiedad User.Identity.IsAuthenticated para determinar si el elemento HTTP Module ya ha autenticado al usuario.

<%@ WebService Language="C#" Class="SecureWebService" %>

using System;
using System.Web.Services;
using System.Web.Services.Protocols;

public class Authentication : SoapHeader {
  public string User;
  public string Password;
}

public class SecureWebService : WebService{
  public Authentication authentication;

  [WebMethod]
  [SoapHeader("authentication")]
  public string ValidUser(){
    if (User.IsInRole("Customer"))
      return "User is in role customer";

    if (User.Identity.IsAuthenticated)
      return "User is a valid user";
    return "not authenticated";
  }
}

El ejemplo de código siguiente contiene un cliente de servicio Web XML que pasa las credenciales necesarias para un mecanismo de autenticación de encabezados SOAP personalizado en un encabezado SOAP Authentication.

    // Create a new instance of an XML Web service proxy class.
    SecureWebService s = new SecureWebService();

    // Create the Authentication SOAP header and set values.
    Authentication a = new Authentication();
    a.User = user.Value;
    a.Password = password.Value;

    // Assign the Header.
    s.AuthenticationValue = a;

      string result = s.ValidUser();
      span1.InnerHtml = result;

Vea también

Proteger aplicaciones Web de ASP.NET | Configuración de ASP.NET | Generar servicios Web XML mediante ASP. NET | NetworkCredential | CredentialCache | X509Certificate