为什么 HTTP 客户端只会在未经身份验证的请求被拒绝后才发送身份验证标头?

信息安全 验证 http 协议
2021-08-25 08:06:11

.NET 类的默认用法是设置属性,HttpClient然后要求类实例执行 HTTP 请求。如果目标需要基本授权,则会发生以下情况(这些类在后台执行此操作,Fiddler 显示正在发生的事情):HttpWebRequestCredentials

  • 第一个请求是在没有授权标头的情况下发送的
  • 服务器拒绝并以 HTTP 401 响应
  • 客户端这次重新发送了相同的请求,其中AuthorizationCredentials标头包含来自属性的正确编码数据

这是默认行为。因此,除非用户验证他的应用程序并采取额外的步骤,否则每个请求都会发送两次——第一个请求会被普遍拒绝。

我的问题是 - 这种默认行为的原因是什么?客户端类具有其Credentials属性集,因此它假设用户想要使用这些凭据进行身份验证。为什么不直接在第一个请求中发送适当的标头?做后者会以某种方式损害客户吗?

1个回答

此行为由RFC2617指定。额外往返的原因是服务器可以请求不同类型的身份验证:基本,摘要等。如果您事先知道服务器进行基本身份验证,那么正如您所说,您可以节省往返。但这不是默认设置,我认为 .NET 库像他们那样公开这一点是正确的。