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
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Cache policy su route groups di Minimal API in ASP.NET Core 7
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Trasformare qualsiasi backend in un servizio GraphQL con Azure API Management
Eseguire attività con Azure Container Jobs
Usare le collection expression per inizializzare una lista di oggetti in C#
Sviluppare un'interfaccia utente in React con Tailwind CSS e Preline UI
Specificare il versioning nel path degli URL in ASP.NET Web API
Utilizzare gli snapshot con Azure File shares
Implementare il throttling in ASP.NET Core