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
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Creare una custom property in GitHub
Combinare Container Queries e Media Queries
Gestire gli accessi con Token su Azure Container Registry
Recuperare App Service cancellati su Azure
Utilizzare una qualunque lista per i parametri di tipo params in C#
Migliorare l'organizzazione delle risorse con Azure Policy
Utilizzare DeepSeek R1 con Azure AI
Recuperare l'ultima versione di una release di GitHub
Change tracking e composition in Entity Framework
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali