Utilizzare WIF in passive mode con siti in load balancing

di Cristian Civera, in Windows Communication Foundation,

Nell'articolo introduttivo ad Access Control Service si è visto come tramite Windows Identity Foundation (WIF) è possibile autenticare facilmente un utente attraverso Identity provider che supportino WS-Federation e WS-Trust. ACS di Windows Azure è uno tra questi, ma è implementato anche da Active Directory Federation Services e può essere supportato dalle proprie applicazioni con un STS personalizzato.

Quando si utilizza WIF in una applicazione ASP.NET, nel web.config viene disabilitata la normale gestione dell'autenticazione e sostituita con due moduli dell'assembly Microsoft.IdentityModel. Uno di questi, il SessionAuthenticationModule, gestisce la sessione dell'utente autenticato mediante l'uso di cookie nel quale inserisce, criptato, le informazioni dell'utente.

Normalmente l'algoritmo di cifratura di basa su Data Protection API (DPAPI) il quale usa una chiave di cifratura gestita e rinnovata autonomamente dal sistema operativo. Le chiavi utilizzate sono però per macchina e per utente, creando problemi di decriptazione del cookie quando l'utente ottiene il cookie da un server e lo restituisce ad un altro.

Per ovviare a questo problema è possibile cambiare il metodo di cifratura del cookie, basandolo su RSA e quindi su certificato digitale, il quale può essere condiviso e configurato tra più macchine.

Per farlo occorre prima di tutto installare un certificato e renderlo visibile, comprensivo di chiave privata, all'utente dell'application pool. Successivamente occorre intervenire nella configurazione della FederatedAuthentication attraverso l'evento ServiceConfigurationCreated, come nello snippet seguente.

protected void Application_Start()
{
  FederatedAuthentication.ServiceConfigurationCreated += FederatedAuthentication_ServiceConfigurationCreated;
}

private void FederatedAuthentication_ServiceConfigurationCreated(object sender, Microsoft.IdentityModel.Web.Configuration.ServiceConfigurationCreatedEventArgs e)
{
  List<CookieTransform> sessionTransforms = new List<CookieTransform>(new CookieTransform[] { 
    new DeflateCookieTransform(), 
    new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate), 
    new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate) 
  });

  SessionSecurityTokenHandler sessionHandler = new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());

  e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
}

Nell'evento non si fa altro che sostituire il SessionSecurityTokenHandler con una nuova lista di CookieTransform, i quali hanno il compito di prepare il valore del cookie. Nell'esempio vengono usati rispettivamente la compressione del cookie, la cifratura e la firma digitale.
Come certificato per le operazioni viene utilizzato quello che è possibile indicare attraverso la sezione di configurazione ServiceCertificate, ma è possibile sfruttare anche altre strade per ottenerlo.

<serviceCertificate>
  <certificateReference x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" findValue="CN=..."/>
</serviceCertificate>

Per maggiori informazioni su ACS 2 e WIF:
https://www.winfxitalia.com/articoli/windows-azure/single-signon-facebook-liveid-yahoo-goole-acs-azure.aspx

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi