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
Inizializzare i container in Azure Container Apps
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Controllare gli accessi IP alle app con Azure Container Apps
Sfruttare al massimo i topic space di Event Grid MQTT
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Reactive form tipizzati con modellazione del FormBuilder in Angular
Trasformare qualsiasi backend in un servizio GraphQL con Azure API Management
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Come migrare da una form non tipizzata a una form tipizzata in Angular
Utilizzare la session affinity con Azure Container Apps
Evitare il flickering dei componenti nel prerender di Blazor 8
Assegnare un valore di default a un parametro di una lambda in C#