Получить IP-адрес клиента и сравнить значения с конфигурацией - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь получить клиентский IP и сравнить значения с конфигурацией.Если это соответствует, необходимо вернуть true / false.Как сделать эту переменную доступной для веб-приложения?Я новичок в ядре .NET.спасибо

Я следовал этой статье, чтобы создать класс промежуточного программного обеспечения, но не уверен, как передать переменную из этого контекста.

https://docs.microsoft.com/en-us/aspnet/core/security/ip-safelist?view=aspnetcore-2.2

    public class SafeListMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<SafeListMiddleware> _logger;
        private readonly string _adminSafeList;

        public SafeListMiddleware(
            RequestDelegate next,
            ILogger<SafeListMiddleware> logger,
                    string adminSafeList)
        {
            _adminSafeList = adminSafeList;
            _next = next;
            _logger = logger;
        }
        public async Task Invoke(HttpContext context)
        {
            if (context.Request.Method != "GET")
            {
                var remoteIp = context.Connection.RemoteIpAddress;

                string[] ip = _adminSafeList.Split(';');

                var bytes = remoteIp.GetAddressBytes();
                var match = false;
                foreach (var address in ip)
                {
                    var testIp = IPAddress.Parse(address);
                    var rangeA = IPAddressRange.Parse(address);
                    if(rangeA.Contains(remoteIp))
                    {
                        match = true;
                        break;
                    }
                }
            }

            await _next.Invoke(context);
        }  
    }
}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Получить клиент RemoteIp и сравнить со значениями конфигурации.сначала вы должны определить Http Accessor в файле Startup , как показано ниже.

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

, а затем в Middleware получить доступ к RemoteIp с помощью приведенного ниже кода и сравнить значение.

var remoteIp = context.Request.HttpContext.Connection.RemoteIpAddress.ToString();
0 голосов
/ 06 февраля 2019

Я бы создал интерфейс, такой как:

public interface IIPChecker
{
    bool IsSafe(IPAddress remoteIpAddress);
}

с реализацией:

public class IPChecker : IIPChecker
{
    private readonly IPAddress[] _safeList;

    public IPChecker(string safeList)
    {
        var _safeList = safeList
            .Split(';')
            .Select(IPAddress.Parse)
            .ToArray();
    }

    public bool IsSafe(IPAddress remoteIpAddress)
    {
        return _safeList.Contains(remoteIpAddress);
    }
}

и вставил бы его в нужные контроллеры:

public class ValuesController : ControllerBase
{
    private readonly IIPChecker _ipChecker;

    public ValuesController(IIPChecker ipChecker)
    {
        _ipChecker = ipChecker;
    }

    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        var isValid = _ipChecker.IsSafe(HttpContext.Connection.RemoteIpAddress);

        .....
    }
}

Если вам нужна эта информация во всех контроллерах, вы можете изменить их для наследования от чего-то вроде

public class IpCheckController : ControllerBase
{
    private readonly IIPChecker _ipChecker;

    public IpCheckController(IIPChecker ipChecker)
    {
        _ipChecker = ipChecker;
    }

    private bool IsSafe => _ipChecker.IsSafe(HttpContext.Connection.RemoteIpAddress);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...