У меня есть приложение, которое позволяет администраторам указывать действительные IP-адреса, с которых можно делать запросы к веб-службе. Я просто беру настроенные IP-адреса и сравниваю их с входящим запросом. Сравнение двух адресов IPv4 тривиально, и я подумал, что сравнение двух адресов IPv6 будет таким же.
Однако мое незнание сетей начало проявляться, когда я заметил, что адреса IPv6 немного сложнее. Одна проблема, которую я заметил, заключается в том, что если я смотрю на IP-адрес на машине (просматривая, какой IP-адрес показывает консоль VMWare) по сравнению с IP-адресом из веб-запроса (HttpContext.Current.Request.UserHostAddress
в .NET), я заметил, что один из них закончился в %10 и еще один в %11:
- ipconfig показывает: fe80:8179:5576:c6d0:8b16%11
- UserHostAddress показывает: fe80::8179:5576:c6d0:8b16%10
Разница только в %10 и %11 - что дает?
Я также видел адреса IPv6, оканчивающиеся на «/», за которыми следуют 2 цифры. Должен ли я просто игнорировать эти последние 3 цифры (если они существуют) при сравнении? Если да, то какие допустимые альтернативные концовки мне нужно искать?
----------- РЕДАКТИРОВАТЬ -------------
Вот мое решение, основанное на предоставленном ответе...
Я просто сохраняю «очищенный» IP-адрес и сравниваю его с «очищенным» IP-адресом. Используя .NET, я очищаю IP-адрес. Не лучший с точки зрения производительности, но он работает. Я бы предпочел просто сравнить GetAddressBytes()
, но я использую Dictionary
и отказался от дополнительного шага создания собственного ByteComparer
.
IPAddress incomingIp = null;
bool ipAddressParsePassed = IPAddress.TryParse(userHostAddress, out incomingIp);
if (ipAddressParsePassed)
{
IPAddress scrubbedIp = new IPAddress(incomingIp.GetAddressBytes());
string scrubbedIpStr = scrubbedIp.ToString()
}