Je travaille sur ASP.Net Core 2.1 avec Angular Template fourni par Microsoft Visual Studio 2017. Mon application client fonctionne correctement. Après la compétition de l'authentification utilisateur, je souhaite démarrer la gestion de session utilisateur dans laquelle je stocke l'adresse IP de l'utilisateur client. J'ai déjà cherché cela sur Internet mais je n'ai pas trouvé de solution jusqu'à présent.
Voici quelques liens de référence que j'ai déjà visités:
Comment obtenir l'adresse IP du client dans ASP.NET CORE?
Obtenir l'adresse IP du client dans ASP.NET Core 2.0
Obtenir une adresse IP utilisateur distante dans ASP.Net Core
Dans mon ValuesController.cs, j'ai également essayé le code ci-dessous:
private IHttpContextAccessor _accessor;
public ValuesController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
public IEnumerable<string> Get()
{
var ip = Request.HttpContext.Connection.RemoteIpAddress.ToString();
return new string[] { ip, "value2" };
}
dans lequel la variable ip je reçois une valeur nulle et obtenir cette erreur
Request.HttpContext.Connection.RemoteIpAddress.Address a levé une exception de type 'System.Net.Sockets.SocketException'
Pouvez-vous s'il vous plaît laissez-moi savoir comment obtenir l'adresse IP du client dans ASP.NET Core 2.1.
Après avoir passé du temps à chercher, j'ai trouvé la réponse à ma propre question. Ici, je partage également le lien source d'où je peux obtenir ma réponse et une explication détaillée de la procédure à suivre pour interroger un serveur afin d'obtenir les adresses de famille et les adresses IP qu'il prend en charge.
Code:
IPHostEntry heserver = Dns.GetHostEntry(Dns.GetHostName());
var ip = heserver.AddressList[2].ToString();
Voici mon autre Question: Comment accéder aux variables de serveur dans ASP.Net Core 2.x J'espère que cela vous aidera à tous.
Dans votre Startup.cs
, assurez-vous que vous avez une méthode pour ConfigureServices, en transmettant la IServiceCollection
, puis enregistrez IHttpContextAccessor
en tant que singleton comme suit:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
Après avoir enregistré la IHttpContextAccessor
dans votre fichier Startup.cs
, vous pouvez injecter la IHttpContextAccessor
dans votre classe de contrôleur et l'utiliser de la manière suivante:
private IHttpContextAccessor _accessor;
public ValuesController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
public IEnumerable<string> Get()
{
var ip = _accessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();
return new string[] { ip, "value2" };
}
Si j'utilise Binding Address Localhost: 5000, l'adresse IP est renvoyée sous la forme ":: 1" (adresse IPv6 de l'hôte local) . Si je lie mon Webapi sur l'adresse IP et tente de l'atteindre à partir d'un autre ordinateur client, j'obtiens Adresse IP du client dans la réponse de l'API . Il n'y a pas besoin de HTTPAccessor, je crois. Selon la documentation https://docs.Microsoft.com/en-us/aspnet/core/Host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1 , HttpContext.Connection.RemoteIpAddress est défini par l'en-tête XForwardedFor.
Si votre application (WEBAPI) se trouve derrière un proxy inverse NGINX/Apache, vous devez permettre à ces mandataires REV d’envoyer une adresse d’en-tête X-Forwarded-For contenant l’adresse IP réelle du client, si vous n’installez ou ne traitez pas X-Forward. Forwarded-For Header, vous obtiendrez toujours l'adresse IP de Nulls ou du serveur proxy inverse.
GetHostEntry ci-dessus n'a aucun lien avec la demande HTTP directement. GetHostEntry est simplement un outil NSLookup pour la programmation d'API. Il vous indique simplement les adresses IP accessibles pour un nom particulier, mais ne vous indique pas de quelle adresse IP la requête est venue à WebApi.
J'espère que cela pourra aider
Cela fonctionne pour moi sur .Net Core 2.2
:
IPHostEntry heserver = Dns.GetHostEntry(Dns.GetHostName());
var ipAddress = heserver.AddressList.ToList().Where(p => p.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).FirstOrDefault().ToString();
Si votre Kestrel est assis derrière un proxy inverse tel que IIS, assurez-vous de transférer les en-têtes contenant l'adresse IP du client.
Cela va au démarrage:
app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});
Il est possible d'utiliser le code suivant:
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
string remoteIpAddress = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
if (Request.Headers.ContainsKey("X-Forwarded-For"))
remoteIpAddress = Request.Headers["X-Forwarded-For"];