如何在ASP.Net Core 2.x中访问服务器变量

时间:2018-07-18 06:00:56

标签: c# asp.net asp.net-core

我正在使用ASP.Net core 2.0 Web应用程序,并将其部署在Azure上。我需要做的是获取客户端IP地址。为此,我在整个Internet上进行搜索,发现服务器变量对此有所帮助。

因此我从here找到了以下代码,以使用以下方式获取客户端IP:

string IpAddress = this.Request.ServerVariables["REMOTE_ADDR"];

但是当我尝试上面的代码时,它显示了一个错误“ HttpRequest不包含服务器变量的定义”

我也尝试过以下代码:

var ip0 = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress;

代码定义

  

RemoteIpAddress 发出请求的客户端的IP地址。请注意,这可能是针对代理而非最终用户的。

以上代码获取IP地址,但它不是clientip,每次我通过控制器访问以上代码时,它都会刷新IP。也许这是一个Azure Web服务代理,每次都会发出get请求。

在ASP.Net Core 2.x中访问服务器变量的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

我发现Mark G参考链接非常有用。

我已使用ForwardedHeadersOptions配置中间件以转发Startup.ConfigureServices中的X-Forwarded-For和X-Forwarded-Proto标头。

这是我的 startup.cs 代码文件:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
           options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

    services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddInMemoryPersistedGrants()
            .AddInMemoryIdentityResources(Config.GetIdentityResources())
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients())
            .AddAspNetIdentity<ApplicationUser>();

    services.AddCors(options =>
    {
        options.AddPolicy("AllowClient",
                   builder => builder.WithOrigins("http://**.asyncsol.com", "http://*.asyncsol.com", "http://localhost:10761", "https://localhost:44335")
                                  .AllowAnyHeader()
                                  .AllowAnyMethod());
        });

        services.AddMvc();
        services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders =
                ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        });

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            // base-address of your identityserver
            //options.Authority = "http://server.asyncsol.com/";
            options.Authority = "http://localhost:52718/";

            // name of the API resource
            options.Audience = "api1";

            options.RequireHttpsMetadata = false;
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseForwardedHeaders();
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseIdentityServer();
        app.UseAuthentication();
        app.UseCors("AllowAll");
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "areas",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
            );
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

现在,在此之后,我将以下代码放入控制器:

public IEnumerable<string> Get()
{
    string ip = Response.HttpContext.Connection.RemoteIpAddress.ToString();

    //https://en.wikipedia.org/wiki/Localhost
    //127.0.0.1    localhost
    //::1          localhost
    if (ip == "::1")
    {
        ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList[2].ToString();
    }

    return new string[] { ip.ToString() };
 }

因此,如果我在本地主机环境上运行,它将显示我的IPv4系统IP地址,如果我在Azure上运行服务器,它将显示我的主机名/ IP地址。

结论:

我在Mark G评论Forwarded Headers Middleware

中找到了答案