Working with SSL in Web API (in inglese)

Diversi schemi di autenticazione comuni non sono protetti tramite HTTP normale. In particolare, l'autenticazione di base e l'autenticazione basata su form inviano credenziali non crittografate. Per essere sicuri, questi schemi di autenticazione devono usare SSL. Inoltre, i certificati client SSL possono essere usati per autenticare i client.

Abilitazione di SSL nel server

Per configurare SSL in IIS 7 o versione successiva:

  • Creare o ottenere un certificato. Per i test, è possibile creare un certificato autofirmato.
  • Aggiungere un'associazione HTTPS.

Per informazioni dettagliate, vedere Come configurare SSL in IIS 7.

Per i test locali, è possibile abilitare SSL in IIS Express da Visual Studio. Nella Finestra Proprietà impostare SSL abilitato su True. Si noti il valore di URL SSL; usare questo URL per testare le connessioni HTTPS.

Immagine di S L abilitata true nelle proprietà

Imporre SSL in un controller di API Web

Se si dispone di un'associazione HTTPS e HTTP, i client possono comunque usare HTTP per accedere al sito. È possibile consentire la disponibilità di alcune risorse tramite HTTP, mentre altre risorse richiedono SSL. In tal caso, usare un filtro di azione per richiedere SSL per le risorse protette. Il codice seguente illustra un filtro di autenticazione di API Web che verifica la presenza di SSL:

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "HTTPS Required"
            };
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }
}

Aggiungere questo filtro a tutte le azioni di API Web che richiedono SSL:

public class ValuesController : ApiController
{
    [RequireHttps]
    public HttpResponseMessage Get() { ... }
}

Certificati client SSL

SSL fornisce l'autenticazione tramite certificati dell'infrastruttura a chiave pubblica. Il server deve fornire un certificato che autentica il server nel client. È meno comune che il client fornisca un certificato al server, ma questa è un'opzione per l'autenticazione dei client. Per usare i certificati client con SSL, è necessario un modo per distribuire i certificati firmati agli utenti. Per molti tipi di applicazioni, questo non sarà un'esperienza utente ottimale, ma in alcuni ambienti ,ad esempio enterprise, potrebbe essere fattibile.

Vantaggi Svantaggi
- Le credenziali del certificato sono più forti del nome utente/password. - SSL offre un canale sicuro completo, con autenticazione, integrità dei messaggi e crittografia dei messaggi. - È necessario ottenere e gestire i certificati PKI. - La piattaforma client deve supportare i certificati client SSL.

Per configurare IIS per accettare i certificati client, aprire Gestione IIS e seguire questa procedura:

  1. Fare clic sul nodo del sito nella visualizzazione albero.

  2. Fare doppio clic sulla funzionalità Impostazioni SSL nel riquadro centrale.

  3. In Certificati client selezionare una delle opzioni seguenti:

    • Accetta: IIS accetterà un certificato dal client, ma non ne richiede uno.
    • Rendi obbligatorio: richiedere un certificato client. Per abilitare questa opzione, è necessario selezionare anche "Richiedi SSL")

È anche possibile impostare queste opzioni nel file ApplicationHost.config:

<system.webServer>
    <security>
        <access sslFlags="Ssl, SslNegotiateCert" />
        <!-- To require a client cert: -->
        <!-- <access sslFlags="Ssl, SslRequireCert" /> -->
    </security>
</system.webServer>

Il flag SslNegotiateCert indica che IIS accetterà un certificato dal client, ma non ne richiede uno (equivalente all'opzione "Accetta" in Gestione IIS). Per richiedere un certificato, impostare il flag SslRequireCert . Per i test, è anche possibile impostare queste opzioni in IIS Express, nel file applicationhost.Config locale, disponibile in "Documents\IISExpress\config".

Creazione di un certificato client per il test

A scopo di test, è possibile usare MakeCert.exe per creare un certificato client. Creare prima di tutto un'autorità radice di test:

makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer

Makecert richiederà di immettere una password per la chiave privata.

Aggiungere quindi il certificato all'archivio "Autorità di certificazione radice attendibili" del server di test, come indicato di seguito:

  1. Aprire MMC.
  2. In File selezionare Aggiungi/Rimuovi snap-in.
  3. Selezionare Account computer.
  4. Selezionare Computer locale e completare la procedura guidata.
  5. Nel riquadro di spostamento espandere il nodo "Autorità di certificazione radice attendibili".
  6. Scegliere Tutte le attività dal menu Azione e quindi fare clic su Importa per avviare l'Importazione guidata certificati.
  7. Passare al file del certificato TempCA.cer.
  8. Fare clic su Apri, quindi su Avanti e completare la procedura guidata. Verrà richiesto di immettere nuovamente la password.

Creare ora un certificato client firmato dal primo certificato:

makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name" 
     -eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk

Uso dei certificati client nell'API Web

Sul lato server è possibile ottenere il certificato client chiamando GetClientCertificate nel messaggio di richiesta. Il metodo restituisce Null se non è presente alcun certificato client. In caso contrario, restituisce un'istanza X509Certificate2 . Utilizzare questo oggetto per ottenere informazioni dal certificato, ad esempio l'autorità emittente e l'oggetto. È quindi possibile usare queste informazioni per l'autenticazione e/o l'autorizzazione.

X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;