Ответ 1
ОБНОВЛЕНИЕ: ASP.NET Core 2.0 имеет метод под названием Url.IsLocalUrl
(см. Этот документ Microsoft).
Я думаю, что этот код будет работать, но я не смог протестировать его полностью
var callingUrl = Request.Headers["Referer"].ToString();
var isLocal = Url.IsLocalUrl(callingUrl);
Но см. Комментарий Дина Уилла ниже об этом подходе:
Любой, кто задумывается об использовании "обновленной" версии, которая проверяет заголовок Referrer, должен иметь в виду, что заголовки чрезвычайно легко подделать, до такой степени, что это не относится к петлевым IP-адресам.
Оригинальное решение
Я наткнулся на это в поисках решения, чтобы узнать, является ли запрос локальным. К сожалению, ASP.NET версии 1.1.0 не имеет метода IsLocal
для соединения. Я нашел одно решение на веб-сайте Strathweb, но оно тоже устарело.
Я создал свое собственное расширение IsLocal
, и оно, кажется, работает, но я не могу сказать, что я проверял его при любых обстоятельствах, но вы можете попробовать его.
public static class IsLocalExtension
{
private const string NullIpAddress = "::1";
public static bool IsLocal(this HttpRequest req)
{
var connection = req.HttpContext.Connection;
if (connection.RemoteIpAddress.IsSet())
{
//We have a remote address set up
return connection.LocalIpAddress.IsSet()
//Is local is same as remote, then we are local
? connection.RemoteIpAddress.Equals(connection.LocalIpAddress)
//else we are remote if the remote IP address is not a loopback address
: IPAddress.IsLoopback(connection.RemoteIpAddress);
}
return true;
}
private static bool IsSet(this IPAddress address)
{
return address != null && address.ToString() != NullIpAddress;
}
}
Вы вызываете это в действии контроллера, используя свойство Request
, т.е.
public IActionResult YourAction()
{
var isLocal = Request.IsLocal();
//... your code here
}
Я надеюсь, что это помогает кому-то.