【发布时间】:2020-10-08 08:50:21
【问题描述】:
上下文
我目前正在开发一个 .net Core 3.1 API,该 API 具有一种身份验证方法,用于检查 HTTP 请求是否是从特定 IP 地址发送的。 请求者的 IP 地址应与存储在数据库或本地主机中的 IP 地址相匹配,否则客户端将被拒绝。
代码
我有以下代码:
控制器
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;
}
问题和疑问
为了全面测试逻辑是否有效,我想编写一个集成测试,它从与 localhost 不同的 IP 地址发送 HTTP 请求。这在.net Core中可能吗?还是应该只依赖单元测试?
【问题讨论】:
-
可以使用任何支持使用代理服务器进行 Web 请求的编程语言的代理服务器。不过,我不确定用实际请求对其进行集成测试是否有利。
-
感谢@John 的快速回复,然后我会调查代理服务器。但我认为发送实际的 HTTP 请求将有利于测试。