Как проверить, находится ли пользователь за тем же маршрутизатором / модемом? - PullRequest
1 голос
/ 01 июня 2019

Моя ситуация проста. У меня есть простая локальная сеть, и в ней есть несколько компьютеров, в том числе несколько подключенных через WiFi. Один из них служит моим веб-сервером и также связан с внешним миром. Остальные - это разные системы, и единственное, что общего, это то, что они получают доступ к моему веб-серверу через мое доменное имя. (Example.com)
Теперь мой веб-сайт имеет панель администратора, которая может быть доступна только для пользователей в моей локальной сети, независимо от того, какое устройство они используют. Я решаю это с помощью Dns.GetHostEntry(IPAddress.Parse(Request.UserHostAddress)).AddressList и Dns.GetHostAddresses(Request.Url.Host), а затем проверяю, есть ли один IP-адрес в обоих списках адресов.
Это лучший способ проверить, находится ли пользователь в моей локальной сети или нет?


Чтобы уточнить: у меня есть кабельный модем, который подключается к моему провайдеру. У меня есть роутер с WiFi и несколько сетевых портов. У меня есть несколько щитов NodeMCU и Arduino / Internet, мой сервер с IIS настроен для привязки к моему домену, моему рабочему столу и нескольким другим устройствам. В основном я фокусируюсь на платах Arduino / NodeMCU, которые используют вызовы WebAPI для отправки данных на мой сайт. Однако внешний мир имеет доступ только для чтения. Но поскольку я не хочу, чтобы в моих устройствах IoT были сложные средства проверки пользователей, мне достаточно, если они все находятся за одним и тем же маршрутизатором ...
Каждое устройство не будет вызывать локальный сервер напрямую, а вместо этого использует доменное имя. Это приводит к единственному переходу к моему провайдеру и обратно, таким образом, один IP-адрес для звонящего и сервера. Оно работает. Это просто не красиво, и мне интересно, есть ли лучший вариант ...


Чтобы прояснить ситуацию: я сейчас использую этот код, который отлично работает:

public static bool IsAuthorized(this HttpRequestBase request)
{
    if (request.IsLocal) return true;
    if (request?.UserHostAddress == null || request?.Url?.Host == null) { return false; }

    var caller = Dns.GetHostEntry(IPAddress.Parse(request.UserHostAddress)).AddressList.Select(a => a.ToString()).ToList();
    var callee = Dns.GetHostAddresses(request.Url.Host).Select(a => a.ToString()).ToList();
    return (caller.Any(c => callee.Any(e => c.Equals(e))));
}

Я не прошу решения проблемы. Я просто хочу знать, есть ли более простой способ получить тот же результат.

...