In alcuni siti è richiesto di salvare all'interno del database l'indirizzo IP del richiedente per alcune azioni svolte dall'utente (login, registrazione, pagamenti, ecc.), allo scopo di mantenere traccia della provenienza delle richieste e per motivi di sicurezza.
L'operazione descritta è attuabile in modo molto semplice utilizzando un intero a 64 bit all'interno del database (in SQL Server il tipo di dato da utilizzare è BIGINT). L'uso di un numero invece di una stringa consente di poter eseguire facilmente confronti, senza possibilità di errore, oltre che essere un approccio che permette di limitare a 8 byte la quantità di spazio utilizzata per gestire questo tipo di informazione.
In ASP.NET l'indirizzo IP associato a una richiesta è reperibile sotto forma di stringa attraverso la proprietà UserHostAddress della classe HttpRequest, che legge e ritorna il valore contenuto nella server variable REMOTE_HOST. Per trasformare il valore della proprietà in un numero intero a 64 bit, possiamo utilizzare una funzione che, una volta risolto l'indirizzo IP, ritorni un valore di tipo long.
In questo caso forniamo un'implementazione sotto forma di extension method della classe HttpContext.
public static class Extensions { public static long GetClientIPAddress(this HttpContext context) { return context.Request.UserHostAddress.GetIPAddressValue(); } public static long GetIPAddressValue(this string clientIPAddress) { long value = 0L; if (clientIPAddress == null) { throw new ArgumentNullException("clientIPAddress"); } // Risolvi l'indirizzo IP del client IPAddress address = Dns.GetHostAddresses(clientIPAddress) .FirstOrDefault( x => x.AddressFamily.Equals(AddressFamily.InterNetwork)); // Genera il valore numerico (intero a 64 bit) if (address != null) { try { string[] octets = address.ToString().Split(new char[] { '.' }); value = Math.Abs( (Int64.Parse(octets[3])) + (Int64.Parse(octets[2]) * 256L) + (Int64.Parse(octets[1]) * 256L * 256L) + (Int64.Parse(octets[0]) * 256L * 256L * 256L)); } catch (Exception) { // Ritorna il valore di default value = 0L; } } return value; } }
All'interno di una pagina possiamo utilizzare il metodo appena definito nei due modi riportati di seguito.
// Versione 1 - Proprietà Context della classe Page long address1 = this.Context.GetClientIPAddress(); // Versione 2 - Istanza corrente del contesto HTTP long address2 = HttpContext.Current.GetClientIPAddress();
Una volta che disponiamo del valore numerico, siamo in grado di salvare questa informazione nel database, sicuri di disporre di una rappresentazione degli indirizzi IP uniforme e attendibile.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Blazor PWA e Offline-First
Usare il versioning con i controller di ASP.NET Core Web API
Usare domini personalizzati con Azure Container App
Pubblicare un pacchetto di NuGet nel feed di GitHub
Effettuare il pull di git LFS in un workflow di GitHub
Sfruttare l'output cache di ASP.NET Core 7 con i controller
Personalizzare le richieste con i rule set di Azure Front Door
Sviluppare applicazioni serverless con Azure Container Apps
Filtrare e rimuovere gli elementi dalla cache del browser tramite le API JavaScript
Velocizzare l'installazione delle dipendenze in un workflow di GitHub
Utilizzare il tag HTML template
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati