HTTP 401 Unauthorized 或 403 Forbidden 对于“已禁用”用户?

Posted

技术标签:

【中文标题】HTTP 401 Unauthorized 或 403 Forbidden 对于“已禁用”用户?【英文标题】:HTTP 401 Unauthorized or 403 Forbidden for a "disabled" user? 【发布时间】:2012-03-02 11:43:31 【问题描述】:

身份验证服务允许禁用用户帐户(一种软删除)。

如果服务器随后接收到对禁用用户的身份验证请求,否则该请求是有效的,服务器应该返回 401 还是 403?无论使用哪种状态代码,我都会返回一条消息,表明该帐户已被禁用。

为了快速参考,来自HTTP/1.1 spec(强调我的)的相关引用:

401 未经授权

请求需要用户身份验证。响应必须包括 包含挑战的 WWW-Authenticate 标头字段(第 14.47 节) 适用于请求的资源。 客户可以重复 请求 具有合适的授权头字段(第 14.8 节)。 如果 该请求已包含授权凭据,然后是 401 响应表明授权已被拒绝 凭据。如果 401 响应包含与 之前的响应,并且用户代理已经尝试过 验证至少一次,然后用户应该被呈现 响应中给出的实体,因为该实体可能 包括相关的诊断信息。 HTTP访问认证 在“HTTP Authentication: Basic and Digest Access”中有解释 身份验证”[43]。

403 禁止

服务器理解请求,但拒绝执行。 授权无济于事,并且不应重复请求。 如果请求方法不是 HEAD 并且服务器希望 公开请求未完成的原因,它应该描述 实体拒绝的原因。如果服务器不希望 将此信息提供给客户端,状态码 404 (未找到)可以代替。

【问题讨论】:

这里有类似的问题(它可能会有所帮助):***.com/questions/8389253/… 【参考方案1】:

基于Roy T. Fielding编写的an email,在当前的HTTP规范中显然有a bug。

规范的阅读方式打算如下(使用上述电子邮件中的引号):

401“未经身份验证”

你不能这样做,因为你还没有通过身份验证

403“未经授权”

用户代理发送了有效的凭据,但没有访问权限

因此,在禁用用户的情况下,403 是正确的响应(404 也是一个选项)。

【讨论】:

【参考方案2】:

对于在这种情况下要返回的内容,我有两个不同的答案。

语义选择 - 401 Unauthorized。在这种情况下,您的客户端提供了凭据,并且根据特定凭据拒绝了请求。如果客户端要使用不同的凭据集再次尝试,或者将来要重新启用该帐户,则相同的请求可能会成功。

安全选项 - 404 Not Found。许多服务会简单地返回一个 404 错误,以避免信息泄露。我立刻想到了 Github。

来自General API Information,在 github 的开发者文档中:

未经身份验证的请求将返回 404 以防止任何形式的 隐私信息泄露。

对于我作为公共服务部署的东西,我可能会使用 404 来避免向攻击者提供有关其凭据尝试的线索。如果是仅供内部使用,或者在测试中,我可能会返回 401。

【讨论】:

+1,特别是为 404 提供案例,但我认为基于 W3 讨论和我发现的错误,HTTP 规范已被破坏。【参考方案3】:

从技术上讲,两者都是正确的,这实际上取决于您想透露多少。

返回 401 告诉调用者该帐户无效,这是正确的,但如果您的 api 将再次被调用以使用相同的凭据注册用户,那么调用也会失败。这对调用者可能没有多大用处。

所以,这实际上取决于您的 api 将如何使用以及目标受众是谁/什么。

【讨论】:

以上是关于HTTP 401 Unauthorized 或 403 Forbidden 对于“已禁用”用户?的主要内容,如果未能解决你的问题,请参考以下文章

请求因HTTP状态401失败:Unauthorized 的原因?

Identity Server 4 的 API 授权不断返回 401 Unauthorized

IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 因为 Web server上此资源的訪问控制列表(ACL)配置或加密设置,您无权查看此文件夹或页面。)

HTTP响应码403 Forbidden和401 Unauthorized对比

当我想在设置 cookie 后重定向时,它显示 HTTP Error 401.0 - Unauthorized

grails spring security rest /api/login 401 Unauthorized