Protezione dei servizi Web XML creati con ASP.NET

Per decidere quale implementazione di protezione è più adatta per un servizio Web XML, è necessario innanzitutto verificare due principi chiave della protezione: l'autenticazione e l'autorizzazione. Per autenticazione si intende il processo di convalida di un'identità sulla base delle credenziali, quali nome utente e password, in base a un'autorità. Dopo l'autenticazione, l'autorizzazione consente di determinare se l'identità è autorizzata ad accedere a una risorsa.

I servizi Web XML creati con ASP.NET possono disporre di opzioni di protezione personalizzate impostando le opzioni di autenticazione e autorizzazione offerte da ASP.NET o protezioni personalizzate basate sul protocollo SOAP. Con l'integrazione tra ASP.NET e Internet Information Services (IIS) vengono offerte varie opzioni di autenticazione e autorizzazione. È anche possibile creare opzioni di autenticazione personalizzate, quale l'utilizzo di intestazioni SOAP. In ASP.NET è inoltre inclusa una funzionalità, nota anche come rappresentazione, con cui è possibile eseguire una richiesta con le credenziali del client. Per ulteriori informazioni sull'utilizzo della rappresentazione, vedere Rappresentazione ASP.NET.

In questo argomento vengono riassunte le opzioni di autenticazione e di autorizzazione disponibili per i servizi Web XML creati con ASP.NET. Per informazioni dettagliate sulle opzioni di protezione disponibili per le applicazioni Web ASP.NET, vedere Protezione di applicazioni Web ASP.NET.

Opzioni di autenticazione per servizi Web XML

I servizi Web XML creati con ASP.NET presentano varie opzioni per l'autenticazione dei client. È quindi necessario essere in grado di individuare quella adatta al servizio Web XML creato. Nella scelta dell'opzione di protezione appropriata, lo sviluppatore deve innanzitutto stabilire il livello di protezione e le prestazioni richieste per il servizio. Per alcuni servizi Web XML è essenziale che le credenziali del client vengano trasmesse in rete in modo protetto. È pertanto fondamentale utilizzare un algoritmo che crittografi le credenziali del client. Lo sviluppatore di un servizio Web XML per l'elaborazione di carte di credito, ad esempio, sarà probabilmente più interessato a proteggere le credenziali dei client e meno preoccupato per l'overhead aggiuntivo dovuto alla crittografia delle informazioni relative alle carte di credito.

Nella tabella che segue viene presentato un riepilogo delle opzioni di autenticazione disponibili per i servizi Web XML creati con ASP.NET. Le opzioni con prefisso Windows fanno parte delle opzioni di autenticazione di Microsoft Windows disponibili per i servizi Web XML creati utilizzando ASP.NET.

Riepilogo delle opzioni di autenticazione

Opzione di autenticazione Descrizione
Windows - Di base Opzione da utilizzare per identificazioni non protette dei client, quale l'invio di nome utente e password come testo normale in stringhe con codifica Base 64. Con questa autenticazione, password e nomi utente sono codificati ma non crittografati. Un utente malintenzionato, determinato e dotato di uno strumento di monitoraggio della rete può intercettare i nomi utente e le password.
Windows - Di base tramite SSL Opzione da utilizzare per identificazioni protette dei client in Internet. Nome utente e password vengono inviati in rete utilizzando la crittografia SSL (Secure Sockets Layer), anziché come testo normale. Questa opzione è relativamente semplice da configurare ed è adatta ad ambienti con accesso a Internet. Tuttavia, l'utilizzo di SSL comporta una riduzione delle prestazioni.
Windows - Classificata Opzione da utilizzare per identificazioni protette dei client in Internet. Utilizza l'hashing per trasmettere credenziali di client in modo protetto. Pertanto la password non viene trasmessa come testo non crittografato. Inoltre, l'autenticazione classificata è in grado di funzionare tramite server proxy. Tuttavia, non è supportata da altre piattaforme.
Windows - Integrata di Windows Utilizza NTLM o Kerberos e uno scambio crittografico con il browser Microsoft Internet Explorer dell'utente.
Windows - Certificati client Opzione da utilizzare per l'identificazione protetta dei client in Internet e Intranet. Richiede per ogni client un certificato che viene richiesto a un'autorità di certificazione attendibile. I certificati possono essere eventualmente mappati ad account utente, i quali vengono a loro volta utilizzati da IIS per l'autorizzazione dell'accesso al servizio Web XML.
Form Non supportata dai servizi Web XML. È un sistema con cui le richieste non autenticate vengono reindirizzate a un form HTML utilizzando il reindirizzamento lato client HTTP. La maggior parte dei client di servizi Web XML non forniranno credenziali tramite un'interfaccia utente e sarà pertanto necessario utilizzare soluzioni alternative per evitare il form di accesso.
Intestazioni SOAP – Personalizzate Opzione utile per ambienti Internet protetti e non protetti. Le credenziali degli utenti vengono passate nell'intestazione SOAP del messaggio SOAP. Il server Web, indipendentemente dalla piattaforma su cui viene eseguito il servizio Web XML, fornisce un'autenticazione personalizzata.

Le impostazioni di protezione per tutte le opzioni sopraelencate, ad eccezione delle intestazioni SOAP, vengono specificate utilizzando una combinazione di file di configurazione e IIS. Per ulteriori informazioni sui file di configurazione, vedere Configurazione di ASP.NET. L'opzione per le intestazioni SOAP personalizzate viene descritta dopo la sezione relativa all'autorizzazione, in quanto tale soluzione riguarda sia l'autenticazione che l'autorizzazione.

Autenticazione di Windows

Sia con IIS che con ASP.NET viene fornito il supporto per l'autenticazione di applicazioni Web, inclusi i servizi Web XML, mediante l'utilizzo di strumenti di protezione incorporati in Windows. In Windows sono disponibili tre opzioni di autenticazione: Di base, Classificata e Integrata di Windows. Ogni opzione può inoltre essere utilizzata con SSL. Poiché tutte le opzioni di autenticazione di Windows, ad eccezione di quella di base, utilizzano qualche forma di crittografia, il livello aggiuntivo di crittografia offerto da SSL è in genere utilizzato soltanto assieme all'opzione di autenticazione Di base o Certificati client.

Indipendentemente dall'opzione di autenticazione di Windows utilizzata, l'impostazione è simile sia per i servizi Web XML che per i relativi client. Un'eccezione è costituita da Certificati client, pertanto la procedura per impostare server e client per l'utilizzo dei Certificati client è riportata più avanti. Non occorre aggiungere ulteriore codice a un servizio Web XML perché possa utilizzare l'autenticazione. Le opzioni di autenticazione vengono infatti impostate in un file di configurazione e in IIS. È necessario aggiungere al client del servizio Web XML il codice per la trasmissione delle credenziali del client al servizio Web XML.

Se viene scelto come parte del sistema di autenticazione utilizzato dal servizio Web XML, SSL deve essere configurato per l'applicazione Web host del servizio Web XML o per il servizio Web XML stesso, utilizzando IIS. La descrizione del servizio e, di conseguenza, le classi proxy da essa generate rifletteranno l'utilizzo di SSL da parte del servizio Web (se l'accesso alla descrizione e alla pagina della Guida in linea del servizio è stato eseguito utilizzando SSL). L'URL del servizio Web XML nella descrizione presenterà il prefisso https. Per ulteriori informazioni sull'impostazione di SSL, vedere la documentazione relativa a IIS.

Per configurare il servizio Web XML per l'autenticazione di Windows

  1. Configurare il servizio Web XML per l'utilizzo dell'autenticazione di Windows, utilizzando IIS.

    IIS consente di impostare la protezione a livello di directory oppure a livello di file. Per impostare la protezione a livello di file per un servizio Web XML, impostare le autorizzazioni per il servizio nel file ASMX in IIS. Tale file rappresenta il punto di ingresso al servizio Web XML. Per ulteriori informazioni, vedere la documentazione relativa a IIS.

  2. Modificare il file di configurazione impostando l'autenticazione di Windows.

    Impostare l'attributo mode dell'elemento XML authentication in un file di configurazione su "Windows". Per ulteriori informazioni sulla configurazione di un file di configurazione, vedere Configurazione di ASP.NET. Nell'esempio di codice seguente viene modificato un file di configurazione per l'utilizzo dell'autenticazione di Windows.

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

Per passare le credenziali dei client a un servizio Web XML utilizzando un'autenticazione di Windows

  1. Creare una nuova istanza della classe proxy sul servizio Web XML. Per ulteriori informazioni nel caso in cui non sia stata generata alcuna classe proxy, vedere Creazione di un proxy di servizio Web XML.

  2. Creare una nuova istanza della classe NetworkCredential, impostando le proprietà UserName, Password e Domain.

  3. Creare una nuova istanza di CredentialCache.

  4. Aggiungere NetworkCredential a CredentialCache utilizzando il metodo Add di CredentialCache.

  5. Assegnare l'istanza di CredentialCache alla proprietà Credentials della classe proxy.

    Se viene utilizzata l'autenticazione di Windows integrata, è necessario impostare la proprietà Credentials su DefaultCredentials.

    Quando la proprietà Credentials è impostata su CredentialCache.DefaultCredentials il client negozia con il server l'adozione dell'autenticazione Kerberos e/o NTLM a seconda di come è configurato il server.

    Nell'esempio di codice seguente vengono impostate le credenziali dei client passate a un metodo di servizio Web XML utilizzando l'autenticazione di 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);
      }
    }
    

Autenticazione con Certificati client

Certificati client è un metodo protetto di autenticazione, in quanto ogni client deve inviare un documento elettronico, ovvero il certificato client, che lo identifica utilizzando una connessione SSL al server Web. Grazie alla connessione SSL, le credenziali del client contenute nel certificato vengono crittografate quando vengono trasmesse in rete. Le comunicazioni tra il client e il server Web vengono crittografate utilizzando una combinazione di chiavi di crittografia inviate dal client e chiavi fornite dal server Web. Una volta stabilita la comunicazione, solo i computer client e server possono comunicare tra loro utilizzando tale connessione SSL.

Il certificato client viene fornito da un'autorità di certificazione, quale il server Web stesso oppure un intermediario attendibile tra client e server. Dopo aver ottenuto il certificato e dopo aver configurato il server Web affinché accetti i certificati client, un client può inviare il proprio certificato al server Web tramite una connessione SSL quando viene chiamato un servizio Web XML. Per ulteriori informazioni sui certificati client, vedere la documentazione relativa a IIS.

Per configurare un servizio Web XML per l'autenticazione con Certificati client

Nella procedura seguente viene brevemente illustrato come configurare IIS per l'autenticazione dei client mediante certificati client. Per ulteriori informazioni, vedere la documentazione relativa a IIS.

  1. Installare SSL.

  2. Configurare l'applicazione Web in modo che accetti i certificati client.

  3. Modificare il file di configurazione impostando l'autenticazione di Windows per il servizio Web XML.

    Impostare l'attributo mode dell'elemento XML authentication in un file di configurazione su "Windows". Per ulteriori informazioni sulla configurazione di un file di configurazione, vedere Configurazione di ASP.NET. Nell'esempio di codice seguente viene modificato un file di configurazione per l'utilizzo dell'autenticazione di Windows.

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

Per passare le credenziali dei client a un servizio Web XML utilizzando un'autenticazione di Windows

  1. Creare una nuova istanza della classe proxy sul servizio Web XML. Per ulteriori informazioni nel caso in cui non sia stata generata alcuna classe proxy, vedere Creazione di un proxy di servizio Web XML.

  2. Creare una nuova istanza di X509Certificate.

  3. Richiamare il metodo CreateFromCertFile per caricare il certificato client da un file.

    Il file del certificato client può essere richiesto a un'autorità di certificazione attendibile. Per ulteriori informazioni, vedere la documentazione relativa a IIS.

  4. Aggiungere X509Certificate all'insieme ClientCertificates della classe proxy.

    Nell'insieme di codice seguente viene mostrata la trasmissione delle credenziali di un servizio Web XML mediante un certificato client. Un certificato client emesso da un server Web viene caricato da un file con il metodo CreateFromCertFile e viene quindi aggiunto alla proprietà ClientCertificates della classe 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);
    

Opzioni di autorizzazione per servizi Web XML

Lo scopo dell'autorizzazione è determinare se a un'identità possa essere concesso il tipo di accesso richiesto a una data risorsa. I metodi principali utilizzati per autorizzare l'accesso a una determinata risorsa sono due: autorizzazione file e autorizzazione URL. L'autorizzazione file può essere utilizzata ogni volta che viene utilizzata l'autenticazione di Windows, in quanto le autorizzazioni in IIS sono impostate a livello di file. L'autorizzazione URL può essere utilizzata con tutti i meccanismi di autenticazione incorporati supportati da ASP.NET. Con l'autorizzazione URL, la configurazione viene effettuata tramite un file di configurazione, in cui è possibile accordare o negare agli utenti l'accesso a ogni file associato ad ASP.NET, compresi i file ASMX.

Per ulteriori informazioni sull'impostazione delle autorizzazioni a livello di file, vedere la documentazione relativa a IIS.

Per ulteriori informazioni sull'impostazione delle autorizzazioni utilizzando un file di configurazione, vedere Autorizzazione ASP.NET.

Intestazioni SOAP – Personalizzate

I meccanismi di autenticazione di Windows, inclusi i certificati client, si basano sul trasporto HTTP, mentre SOAP non dipende dal tipo di trasporto. I servizi Web XML creati con ASP.NET utilizzano SOAP su HTTP. Pertanto, una finalità della creazione di un meccanismo di autenticazione personalizzata è la separazione dell'autenticazione dal trasporto. Per eseguire questa operazione è necessario passare le credenziali di autorizzazione nell'intestazione SOAP.

Le intestazioni SOAP rappresentano un efficiente metodo per passare informazioni fuori banda o non correlate alla semantica di un servizio Web XML. A differenza dell'elemento Body di un messaggio SOAP, che include i parametri in e out per il metodo di servizio Web XML, i quali vengono poi elaborati dal metodo di servizio Web XML, l'elemento Header è facoltativo e può essere quindi elaborato dall'infrastruttura. Ovvero, viene elaborato dall'infrastruttura sviluppata come meccanismo di autenticazione personalizzato.

La soluzione personalizzata illustrata di seguito viene creata con ASP.NET come meccanismo di autenticazione che utilizza intestazioni SOAP. La soluzione viene creata effettuando le operazioni seguenti:

  • Viene creato un modulo HTTP personalizzato che viene eseguito sul server Web che ospita i servizi Web XML.
  • Il modulo HTTP analizza i messaggi HTTP e verifica se sono messaggi SOAP.
  • Se rileva un messaggio SOAP, il modulo HTTP legge le intestazioni SOAP.
  • Se il messaggio SOAP presenta un'intestazione SOAP con credenziali di autorizzazione, il modulo HTTP genera un evento global.asax personalizzato.

Per modificare il servizio Web XML affinché utilizzi l'autenticazione con intestazione SOAP personalizzata, il servizio Web XML deve eseguire due operazioni: specificare che viene prevista l'intestazione SOAP contenente le credenziali di autenticazione e autorizzare il client ad accedere al servizio Web XML. Nell'esempio il modulo HTTP autentica l'utente e imposta le proprietà Context che possono essere utilizzate da un servizio Web XML per decidere se autorizzare il client ad accedere a tale servizio.

Il client del servizio Web XML invia le credenziali al servizio Web XML aggiungendo l'intestazione SOAP prevista alla richiesta SOAP e inserendovi le credenziali del client. Si noti che nell'esempio il testo è inviato in rete in formato leggibile (non protetto). Se il testo non è sufficientemente protetto per l'applicazione, aggiungere un algoritmo di crittografia.

Nell'esempio di codice che segue viene presentato un modulo HTTP che analizza i messaggi HTTP per le richieste SOAP. Se il messaggio HTTP è un messaggio SOAP, viene generato un evento WebServiceAuthenticationEvent personalizzato.

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;
      }
    }
}

Nell'esempio di codice che segue viene mostrato l'evento personalizzato di autenticazione generato dal modulo HTTP alla ricezione di una richiesta 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;
         }
       }
    }
}

Nell'esempio di codice seguente viene presentato il delegato per l'evento WebServiceAuthenticationEvent personalizzato.

namespace Microsoft.WebServices.Security 
{
   using System;

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

Nell'esempio di codice seguente viene presentato un servizio Web XML Web che definisce l'intestazione SOAP Authentication che deve essere passata da un client. Il servizio Web XML non deve eseguire l'autenticazione, bensì controllare tramite la proprietà User.Identity.IsAuthenticated se il modulo HTTP ha autenticato l'utente.

<%@ 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";
  }
}

Nell'esempio di codice seguente viene presentato un client di servizio Web XML che passa le credenziali necessarie per il meccanismo di autenticazione con intestazioni SOAP personalizzate in un'intestazione 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;

Vedere anche

Protezione di applicazioni Web ASP.NET | Configurazione di ASP.NET | Generazione di servizi Web XML mediante ASP.NET | NetworkCredential | CredentialCache | X509Certificate