如何在asp.netcore中获取客户端ip?(代码片段)

dotNET跨平台 dotNET跨平台     2023-01-11     279

关键词:

咨询区

  • eadam

在 ASP.NET 中我可以用 Request.ServerVariables["REMOTE_ADDR"] 来获取客户端IP地址,请问在 ASP.NET Core 中我该如何实现呢?

回答区

  • CodingYourLife

如果你用的是 .NET 5,可以用内部提供的扩展方法来实现获取客户端IP,参考代码如下:

public static class HttpContextExtensions

    //https://gist.github.com/jjxtra/3b240b31a1ed3ad783a7dcdb6df12c36

    public static IPAddress GetRemoteIPAddress(this HttpContext context, bool allowForwarded = true)
    
        if (allowForwarded)
        
            string header = (context.Request.Headers["CF-Connecting-IP"].FirstOrDefault() ?? context.Request.Headers["X-Forwarded-For"].FirstOrDefault());
            if (IPAddress.TryParse(header, out IPAddress ip))
            
                return ip;
            
        
        return context.Connection.RemoteIpAddress;
    

然后像下面这样调用。

var ipFromExtensionMethod = HttpContext.GetRemoteIPAddress().ToString();
  • crokusek

在 ASP.NET Core 的世界里,一般都会在 Kestrel 前加上 IIS 或 Nginx 做负载均衡,在这种场景下获取客户端IP需要做一些额外处理,那就是在 Http Header 头上增加 X-Forwarded-For 标记,其实不管有没有负载均衡,建议都加上,参考代码如下:

public string GetRequestIP(bool tryUseXForwardHeader = true)

    string ip = null;

    // todo support new "Forwarded" header (2014) https://en.wikipedia.org/wiki/X-Forwarded-For

    // X-Forwarded-For (csv list):  Using the First entry in the list seems to work
    // for 99% of cases however it has been suggested that a better (although tedious)
    // approach might be to read each IP from right to left and use the first public IP.
    // http://stackoverflow.com/a/43554000/538763
    //
    if (tryUseXForwardHeader)
        ip = GetHeaderValueAs<string>("X-Forwarded-For").SplitCsv().FirstOrDefault();

    // RemoteIpAddress is always null in DNX RC1 Update1 (bug).
    if (ip.IsNullOrWhitespace() && _httpContextAccessor.HttpContext?.Connection?.RemoteIpAddress != null)
        ip = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();

    if (ip.IsNullOrWhitespace())
        ip = GetHeaderValueAs<string>("REMOTE_ADDR");

    // _httpContextAccessor.HttpContext?.Request?.Host this is the local host.

    if (ip.IsNullOrWhitespace())
        throw new Exception("Unable to determine caller's IP.");

    return ip;


public T GetHeaderValueAs<T>(string headerName)

    StringValues values;

    if (_httpContextAccessor.HttpContext?.Request?.Headers?.TryGetValue(headerName, out values) ?? false)
    
        string rawValues = values.ToString();   // writes out as Csv when there are multiple.

        if (!rawValues.IsNullOrWhitespace())
            return (T)Convert.ChangeType(values.ToString(), typeof(T));
    
    return default(T);


public static List<string> SplitCsv(this string csvList, bool nullOrWhitespaceInputReturnsNull = false)

    if (string.IsNullOrWhiteSpace(csvList))
        return nullOrWhitespaceInputReturnsNull ? null : new List<string>();

    return csvList
        .TrimEnd(',')
        .Split(',')
        .AsEnumerable<string>()
        .Select(s => s.Trim())
        .ToList();


public static bool IsNullOrWhitespace(this string s)

    return String.IsNullOrWhiteSpace(s);

点评区

确实在获取客户端IP的时候要考虑到 X-Forwarded-For,毕竟对外的业务系统都是按集群为单位对外提供服务的,学习了。

如何在 ASP.NET CORE 3.1 中获取客户端 IP 地址?

】如何在ASP.NETCORE3.1中获取客户端IP地址?【英文标题】:HowdoIgetclientIPaddressinASP.NETCORE3.1?【发布时间】:2020-04-2921:06:39【问题描述】:在WebAPI项目中编写代码时如何在ASP.NET3.1中获取客户端IP地址【问题讨论】:这能回答你的问题... 查看详情

在 ASP.NET Core 2.2 中获取客户端的 IP 地址

】在ASP.NETCore2.2中获取客户端的IP地址【英文标题】:Getclient\'sIPaddressinASP.NETCore2.2【发布时间】:2019-12-0710:57:09【问题描述】:我在asp.netcore2.2中创建了一个微服务应用程序。我想从他使用它的地方获取用户的IP地址。下面的sn-p... 查看详情

ASP.NET Core 3.1 - 如何获取客户端的 IP 地址?

】ASP.NETCore3.1-如何获取客户端的IP地址?【英文标题】:ASP.NETCore3.1-HowdoIgetaclient\'sIPAddress?【发布时间】:2020-05-1609:44:32【问题描述】:我有一个Razor页面Web应用程序并正在记录用户的IP地址。出于某种原因,它返回的是IP地址,... 查看详情

asp.netcore获取客户端ip地址(代码片段)

1、在ConfigureServices注入IHttpContextAccessor//ASP.NETCore2.1的注入方式//services.AddHttpContextAccessor();//services.TryAddSingleton<IActionContextAccessor,ActionContextAccessor>();//注入services.AddSing 查看详情

asp.netcore获取客户端ip(代码片段)

publicasyncTask<IActionResult>WpfDoLogin(stringaccount,stringpassword) //获取访问者ip stringip=HttpContext.Connection.RemoteIpAddress.ToString(); varresult=awaitwpfUserBusiness.CheckWpfUser 查看详情

ASP.NET Core:如何获取远程 IP 地址?

...时间】:2016-04-0109:06:32【问题描述】:我尝试获取远程(客户端)IP地址:varip=httpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress但它只适用于本地请求(它会返回::1值)当我从远程 查看详情

如何在 Asp.net Core 中获取用户浏览器名称(用户代理)?

...间】:2015-04-2405:52:15【问题描述】:能否告诉我如何获取客户端在MVC6、ASP.NET5中使用的浏览器名称?【问题讨论】:【参考方案1】:我认为这很容易。在Request.Headers["User-Agent"]. 查看详情

asp.netcore中如何设置ip白名单(代码片段)

咨询区MartinM:我想在一个web站点中实现ip白名单功能,在MVC时代我只需要在web.config中添加如下配置即可。<security>  <ipSecurity allowUnlisted="false" denyAction="NotFound">    <add allowed 查看详情

asp.netcore安全防护-客户端ip白名单限制(代码片段)

前言本篇展示了如何在ASP.NETCore应用程序中设置IP白名单验证的2种方式。你可以使用以下2种方式:用于检查每个请求的远程IP地址的中间件。MVC操作筛选器,用于检查针对特定控制器或操作方法的请求的远程IP地址。中间... 查看详情

如何在 asp.net core 中使用 websockets

...数据。现在我想实现websockets以便将通知从服务器发送到c#客户端 查看详情

如何在 ASP.NET Core 1.0 中获取 bin 文件夹

】如何在ASP.NETCore1.0中获取bin文件夹【英文标题】:HowtogetbinfolderinASP.NETCore1.0【发布时间】:2016-02-2018:16:15【问题描述】:在asp.netcore1.0中添加了很多功能。但是没有办法获得Bin文件夹路径。谁能知道我们如何获取asp.netcore1.0应用... 查看详情

如何在backgroundservice获取asp.netcore启动地址(代码片段)

前言上次,我们介绍了《如何获取ASP.NETCore启动地址》。但是,如果要在BackgroundService中获取启动地址可不那么容易,因为BackgroundService在app启动前就开始执行了:var builder = WebApplication.CreateBuilder(args);builder.Services.A... 查看详情

如何在 ASP.NET Core 中获取 HttpContext.Current? [复制]

】如何在ASP.NETCore中获取HttpContext.Current?[复制]【英文标题】:HowtogetHttpContext.CurrentinASP.NETCore?[duplicate]【发布时间】:2016-11-2823:44:31【问题描述】:我们目前正在使用ASP.NETCore重写/转换我们的ASP.NETWebForms应用程序。尽量避免重新... 查看详情

如何在 ASP.NET Core 3.1 中启用多重身份验证?

...1项目中,我使用jwt进行身份验证。问题是我也在使用azure客户端来获取vm大小名称列表,并且它也在使用Bearer令牌。现在测试我使用azure中的AllowAnonymo 查看详情

如何在 ASP.NET Core 中使用 npm

...SP.NETCore应用程序所需的jQuery、Bootstrap、FontAwesome和类似的客户端库。对我有用的方法首先是在项目中添加一个package.json文件,如下所示:"version":"1.0.0","name":"my 查看详情

asp.netcore定时刷新第三方token(代码片段)

前言在《ASP.NETCore自动刷新JWTToken》中我们实现了为客户端自动提供最新的Token。但是,当我们的ASP.NETCore应用需要调用第三方API时,如何更优雅地刷新第三方提供的Token呢?思路我们可以在启动时就获取第三方提供的To... 查看详情

如何在 ASP.NET Core 5.0 中处理来自客户端的双重请求?

】如何在ASP.NETCore5.0中处理来自客户端的双重请求?【英文标题】:HowtohandledoublerequestsfromtheclientinASP.NETCore5.0?【发布时间】:2021-12-1309:13:22【问题描述】:客户端应用程序对服务器上的单个资源进行双重查询。第一帧没有授权头... 查看详情

如何获取 ASP.NET Core 中所有路由的列表?

】如何获取ASP.NETCore中所有路由的列表?【英文标题】:HowtogetalistofallroutesinASP.NETCore?【发布时间】:2015-04-1017:24:11【问题描述】:在ASP.NETCore中,有没有办法查看Startup中定义的所有路由的列表?我们使用IRouteBuilder的MapRoute扩展... 查看详情