繁体   English   中英

从.NET Core中另一个IP地址发送HTTP请求

[英]Send a HTTP request from another IP address in .NET Core

语境

我目前正在研究 .net Core 3.1 API,它具有一种身份验证方法,可以检查 HTTP 请求是否从特定的 IP 地址发送。 请求者 IP 地址应与存储在数据库或本地主机中的地址匹配,否则客户端将被拒绝。

代码

我有以下代码:

Controller

 public async Task<IActionResult> AuthenticatePlanbord([FromBody] AuthPlanbordRequest request)
        {
            if (request.AuthType == AuthType.Planbord)
            {
                // Validate the IP address of the client to check if the request is made from the server of the planbord.
                var ip = _accessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();
                var AuthResponse = await _authService.AuthenticatePlanbordAsync(ip, request.DatabaseName, request.UserId);
                if (AuthResponse == null) return Unauthorized(new ServerResponse(false, "Unauthorized", HttpStatusCode.Unauthorized));
                return Ok(new ServerResponse(TokenGenerator.GenerateJsonWebToken(AuthResponse)));
            }
            return BadRequest(new ServerResponse(false, _localizer["AuthTypeNotSupported"], HttpStatusCode.BadRequest));
        }

认证服务

public async Task<AuthEntityPlanbord> AuthenticatePlanbordAsync(string ip, string databaseName, Guid userId = default)
        {
            _unitOfWork.Init();
            // Check if the request does not originate from localhost
            if (ip != "::1")
            {
                var Ip = await _unitOfWork.Connection.ExecuteScalarAsync<string>("SELECT IpAdres FROM PlanbordAutorisaties WITH(NOLOCK) WHERE IpAdres = @Ip ", new { Ip = ip }, _unitOfWork.Transaction);
                if (string.IsNullOrEmpty(Ip)) return null;
            }
            var userData = await _unitOfWork.AuthRepository.AuthenticatePlanbordAsync(userId);
            userData.IPAdress = ip;
            userData.DatabaseName = databaseName;
            return userData;
        }

问题与疑问

为了全面测试逻辑是否有效,我想编写一个集成测试,从与本地主机不同的 IP 地址发送 HTTP 请求。 这在 .net Core 中可行吗? 或者我应该只依赖单元测试吗?

简单的方法(适用于任何语言)是使用像reqbin或类似的服务来模拟请求。 作为一项在线服务,它将有一个不同的 IP。

您可以找到其他类似的服务。 这个特别有一个 API 示例可用。 因此,如果你想将它集成到你的单元测试或类似的东西中,你只需要模拟一个 POST 请求到他们的 api,参数指向你的端点,这样你就可以模拟来自 IP 的外部请求,而不是白名单。

是的,如果这是一个 API 呼叫,您可以使用 HTTP 客户端创建一个请求。

您可以将 HTTP 客户端设置为在处理程序中使用代理。

var httpclienthandler = new HttpClientHandler
            {
                // Set creds in here too if your proxy needs auth
                Proxy = new WebProxy("proxyIp")
            };
var httpClient = new HttpClient(httpclienthandler);

如果这是网站操作,您可以将浏览器设置为使用代理,或者只是连接到 VPN?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM