我有这样的路线:
[Route("api/elasticsearch/resync/products")]
[HttpGet]
public async Task<string> ResyncProducts()
{
}
如何只能从localhost访问它?
答案 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!");
});
}