如何使路由只能从localhost访问?

时间:2018-03-16 13:10:02

标签: c# asp.net-core

我有这样的路线:

[Route("api/elasticsearch/resync/products")]
[HttpGet]
public async Task<string> ResyncProducts()
{
}

如何只能从localhost访问它?

3 个答案:

答案 0 :(得分:3)

您可以使用操作过滤器并检查请求是否来自loopback接口:

public class RestrictToLocalhostAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var remoteIp = context.HttpContext.Connection.RemoteIpAddress;
        if (!IPAddress.IsLoopback(remoteIp)) {
            context.Result = new UnauthorizedResult();
            return;
        }
        base.OnActionExecuting(context);
    }
}

然后用这个属性装饰动作:

[Route("api/elasticsearch/resync/products")]
[HttpGet]
[RestrictToLocalhost]
public async Task<string> ResyncProducts()
{
}

小心context.HttpContext.Connection.RemoteIpAddress。如果您处于正向代理模式(某些其他网络服务器,如IIS或Nginx向您转发请求) - 此IP可能始终是localhost(因为它实际上是nginx \ iis向您发出请求),甚至是null,即使对于远程请求也是如此,如果您错误地配置您的应用程序。但如果所有配置都正确 - 那应该没问题。

不要像其他答案所说的那样使用CORS。它不会阻止任何人从任何ip调用你的api。 CORS是浏览器功能,在浏览器之外(恶意用户当然不会通过浏览器页面请求您的api) - 它的效果完全没有。

答案 1 :(得分:1)

研究使用CORS。正确安装后,您应该能够应用这样的属性 [EnableCors(origins: "http://localhost", headers: "*", methods: "*")]

见这里: https://tahirnaushad.com/2017/09/09/cors-in-asp-net-core-2-0/

答案 2 :(得分:-1)

Brandon Miller's answer的帮助下找到答案:

https://docs.microsoft.com/en-us/aspnet/core/security/cors#enabling-cors-in-mvc

在每次操作MVC中启用CORS:

[HttpGet]
[EnableCors("AllowSpecificOrigin")]
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

并在Startup.cs中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowSpecificOrigin",
            builder => builder.WithOrigins("http://example.com"));
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // Shows UseCors with named policy.
    app.UseCors("AllowSpecificOrigin");
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}