了解 401 的基本身份验证

Posted

技术标签:

【中文标题】了解 401 的基本身份验证【英文标题】:understanding basic authentication with a 401 【发布时间】:2012-12-09 22:49:36 【问题描述】:

关于网络浏览器的基本身份验证,我有点困惑。我原以为 Web 浏览器只会在上一个响应中收到 HTTP 401 状态后才发送 Authorization 标头。但是,Chrome 似乎在此后的每个请求中都发送了 Authorization 标头。它包含我曾经输入的数据,以响应我网站上的 401,并与每条消息一起发送(根据 Chrome 和我的网络服务器附带的开发人员工具)。这是预期的行为吗?是否有一些我应该与我的 401 一起使用的标头来推断不应缓存授权内容?我目前正在使用 WWW-Authenticate 标头。

【问题讨论】:

【参考方案1】:

这是RFC 2617 (Section 2) 中定义的浏览器的预期行为:

A client SHOULD assume that all paths at or deeper than the depth of
the last symbolic element in the path field of the Request-URI also
are within the protection space specified by the Basic realm value of
the current challenge. A client MAY preemptively send the
corresponding Authorization header with requests for resources in
that space without receipt of another challenge from the server.
Similarly, when a client sends a request to a proxy, it may reuse a
userid and password in the Proxy-Authorization header field without
receiving another challenge from the proxy server. See section 4 for
security considerations associated with Basic authentication.

据我所知,基本 HTTP 身份验证无法执行注销/重新身份验证。再加上 HTTP 基本身份验证缺乏安全性,这就是为什么现在大多数网站都使用表单和 cookie 作为身份验证解决方案的原因。

【讨论】:

你是对的。在 Basic Auth 的范围内,“注销”是相当没有意义的,因为 在每个请求中 都会发送安全令牌。本质上,每个 HTTP 请求都经过单独身份验证。您可以强制浏览器停止身份验证,例如参见***.com/questions/5957822/…。【参考方案2】:

来自RFC 2617:

如果先前的请求已获得授权,则 相同的凭证可以重复用于其中的所有其他请求 保护空间的时间段由确定 身份验证方案、参数和/或用户偏好。

根据我的经验,浏览器会自动为后续请求发送基本凭据是很常见的。它避免了为额外资源进行额外的往返。

【讨论】:

以上是关于了解 401 的基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

不使用 HTTP 基本身份验证时 HTTP 401 未经授权?

auth0 401 错误,在尝试身份验证代码交换时进行身份验证

android - EWS 2010 中的基本身份验证错误“HTTP/1.1 401 Unauthorized”

Phonegap错误:401未经授权 - 在Phonegap中使用基本身份验证的Rest API

通过基本身份验证访问 REST 的 Angular2 抛出“预检响应具有无效的 HTTP 状态代码 401”

如果下游服务响应 401,如何在 Zuul API 网关中触发 OAuth2 身份验证