Refit / API / HTTPS 连接:在 header 上添加密码 - 这样安全吗?

Refit / API / HTTPS Connection: adding password on header - Is this safe?

我正在设置一个新的 WebAPI 服务器 (ASP NET),我们正在使用 HTTPS 并检查通过消息 [=33= 传递的有效密码].

服务器端,我可以检查是否每个包都是通过 HTTPS 传递的,以及它是否包含正确的 header 和密码信息。

我的问题是:我们在 API 客户端上使用 refit,在每个包上插入密码作为 header。客户端能否传递 header 或未加密的单个消息?

代码如下:

连接和初始化

var httpClient = new HttpClient(new AuthenticatedHttpClientHandler())
{
    BaseAddress = new Uri("https://10.103.208.16:45456/")
}; 


var nsAPI = RestService.For<Interface1>(httpClient);

方法调用:

var sugars = await nsAPI.GetMakeUps(); 

插入密码的HttpHandler

class AuthenticatedHttpClientHandler : HttpClientHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Add("pw", "MY_SECRET_PW");
        return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
    }
}

我是否存在密码被未加密嗅探的风险? 我可以强制改装以仅通过 HTTPS 连接通信/发送包吗?

这只是我的副本 answer to the identical question raised as a Refit issue:

Refit 使用标准 .NET HttpClient(您在示例中明确使用了一个),因此它与直接使用 HttpClient 一样安全。

在您的示例中,您将基地址设置为 HTTPS URI,这就是 Refit 将永远用来发起 请求的所有内容。

但是,如果您的服务器重定向到 HTTP URI(这种可能性很小)并且 HttpClient 配置为 auto-follow 重定向(这可能是默认设置),则可能后续请求重定向到这个不安全的 URL。 如果是这种情况,您的处理程序将根据不安全的请求发送密码。

这种情况不太可能发生,但无论如何都有一个简单的解决方法——只需在附加密码之前检查 URL 的方案:

class AuthenticatedHttpClientHandler : HttpClientHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if(string.Equals(request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
            request.Headers.Add("pw", "MY_SECRET_PW");
        return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
    }
}

这样一来,如果您以某种方式最终发出 HTTP 请求而不是 HTTPS 请求,您将不会随请求一起发送密码。

如果您担心您的密码在 HTTPS 请求中是否可嗅探,只有当计算机 运行 客户端已被入侵并且信任不应该信任的人时,这才是真正可能的。但如果是这种情况,则有更简单的方法来获取您的密码,例如例如,通过反编译 DLL 或读取配置文件。