【问题标题】:Get client IP and compare values with the configuration获取客户端 IP 并将值与配置进行比较
【发布时间】:2019-02-06 12:31:23
【问题描述】:

我正在尝试获取客户端 IP 并将值与配置进行比较。如果匹配需要返回真/假。如何使 Web 应用程序可以访问此变量?我是 .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);
        }  
    }
}

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-core-mvc


    【解决方案1】:

    我会创建一个界面,例如:

    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);
    }
    

    【讨论】:

      【解决方案2】:

      获取客户端 RemoteIp 并与配置值进行比较。您必须首先在 Startup 文件中定义 Http Accessor,如下所示。

      services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
      

      然后在中间件中使用下面的代码访问 RemoteIp 并比较值。

      var remoteIp = context.Request.HttpContext.Connection.RemoteIpAddress.ToString();
      

      【讨论】:

        猜你喜欢
        • 2013-07-14
        • 2022-01-21
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 2019-04-09
        • 1970-01-01
        • 2018-01-13
        相关资源
        最近更新 更多