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
Realizzare un accordion con gli elementi HTML details e summary
Ottimizzare le API in ASP.NET con Feature Flags
From Data to Insight: Exploratory Data Analysis with Python, VS Code and SQL MCP Server
GitHub Copilot CLI in ambienti offline
Interagire con Azure DevOps tramite MCP Server
Eseguire i pre-commit hook di git con dependabot
Abilitare .NET 10 su Azure App Service e Azure Functions
Raggruppamento degli aggiornamenti di dipendenze tra directory in un monorepo con Dependabot
DevSecOps per .NET: dalla teoria alla pratica
Creare una cache temporanea in JavaScript
Validazione personalizzata nelle Minimal API di ASP.NET Core
Utilizzare il Null conditional assignment di C# 14


