首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问ASP.Net Core2.x中的服务器变量

如何访问ASP.Net Core2.x中的服务器变量
EN

Stack Overflow用户
提问于 2018-07-18 06:00:56
回答 2查看 26.1K关注 0票数 17

我使用的是ASP.Net核心2.0 web应用程序,它部署在Azure上。我需要做的是获取客户的IP地址。为此,我在互联网上搜索,发现服务器变量在这方面帮助我。

因此,我从这里中找到了以下代码来获取客户端IP:

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

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

此外,我还尝试了下面的代码:

代码语言:javascript
复制
var ip0 = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress;

代码定义

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2018-07-19 06:52:15

我发现马克·G的参考链接非常有用。

我已经用ForwardedHeadersOptions配置了中间件,以在Startup.ConfigureServices中转发X-Forwarded-ForX-Forwarded-Proto头。

下面是我的Startup.cs代码文件:

ConfigureServices

代码语言:javascript
复制
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();
    /* The relevant part for Forwarded Headers */
    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;
    });
}

配置

代码语言:javascript
复制
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    /* The relevant part for Forwarded Headers */
    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?}");
    });
}

控制器的使用

代码语言:javascript
复制
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地址。

结论:

我在马克·G评论转发头中间件上找到了我的答案

票数 10
EN

Stack Overflow用户

发布于 2018-07-18 06:53:27

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51394593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档