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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migrare una service connection a workload identity federation in Azure DevOps
Filtering sulle colonne in una QuickGrid di Blazor
Referenziare un @layer più alto in CSS
Supportare la sessione affinity di Azure App Service con Application Gateway
Miglioramenti nell'accessibilità con Angular CDK
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Implementare l'infinite scroll con QuickGrid in Blazor Server
Creare una libreria CSS universale: i bottoni
Creare una libreria CSS universale: Immagini
Miglioramenti agli screen reader e al contrasto in Angular
Utilizzare l nesting nativo dei CSS
Recuperare App Service cancellati su Azure