403 Forbidden vs 401未经授权的HTTP响应

对于存在的网页,但对于没有足够权限的用户(他们没有登录或不属于正确的用户组),什么是正确的HTTP响应服务? 401? 403? 还有别的吗? 目前为止我读过的每一篇文章都不太清楚两者之间的区别。 哪些用例适用于每个响应?


Daniel Irvine的明确解释:

401 Unauthorized存在一个问题,即认证错误的HTTP状态码。 这就是它:它用于身份验证,而不是授权。 接收到401响应的是服务器告诉你,“你没有通过身份验证 - 根本没有进行身份验证或验证不正确 - 但请重新进行身份验证并再试一次。”为了帮助您解决问题,它始终包含一个WWW-Authenticate标头,该标头描述了如何认证。

这是您的Web服务器通常返回的响应,而不是您的Web应用程序。

这也是非常短暂的事情; 服务器要求您再试一次。

所以,为了授权,我使用403 Forbidden响应。 它是永久的,它与我的应用程序逻辑相关联,而且比401更具体。

收到403响应是服务器告诉你,“我很抱歉。 我知道你是谁 - 我相信你说你是谁 - 但你只是没有权限访问此资源。 也许如果你很好地问系统管理员,你会得到许可。 但请不要再困扰我,直到你的困境发生变化。“

总之,应该使用401未经授权的响应来验证缺失或错误,并且之后应该使用403禁止响应,当用户通过身份验证但未被授权对给定资源执行请求的操作时。

http状态码应该如何使用的另一个很好的图片格式。


请参阅RFC2616:

401未经授权:

如果请求已包含授权凭证,则401响应表明授权已被拒绝。

403禁止:

服务器了解请求,但拒绝履行它。

更新

从您的用例看来,用户似乎没有通过身份验证。 我会返回401。


编辑:RFC2616已过时,请参阅RFC7231和RFC7235。


缺少其他答案的是,必须了解的是,RFC 2616中的认证和授权仅指RFC 2617的HTTP认证协议.HTTP状态代码不支持RFC2617以外的方案进行认证,并且不考虑当决定是否使用401或403 ..

简而言之,Terse

未经授权表示客户端未经RFC2617认证且服务器正在启动认证过程。 Forbidden指示客户端经过RFC2617认证且没有授权,或者服务器不支持所请求资源的RFC2617。

这意味着如果您拥有自己的自己的登录过程并且从不使用HTTP身份验证,则403始终是正确的响应,并且不应使用401。

详细和深入

来自RFC2616

10.4.2 401未经授权

该请求需要用户认证。 响应必须包含一个WWW-Authenticate头域(14.47节),其中包含一个适用于所请求资源的挑战。 客户端可以用适当的授权标题字段重复请求(14.8节)。

10.4.4 403禁止服务器理解请求,但拒绝履行请求。 授权不起作用,请求不应重复。

首先要记住的是本文档中的“身份验证”和“授权”专指RFC 2617中的HTTP身份验证协议。它们不涉及您可能创建的任何自己的身份验证协议使用登录页面等。我将使用“登录”来引用RFC2617以外的方法进行身份验证和授权

所以真正的区别不在于问题是什么,或者即使有解决方案。 区别在于服务器期望客户端接下来要做的事情。

401表示无法提供资源,但服务器正在请求客户端通过HTTP身份验证登录并已发送回复头以启动该进程。 可能存在允许访问资源的授权,可能没有授权,但可以尝试一下,看看会发生什么。

403表示无法提供资源,对于当前用户,无法通过RFC2617解决此问题,也无法尝试。 这可能是因为已知没有足够的身份验证(例如因为IP黑名单),但可能是因为用户已经通过身份验证并且没有权限。 RFC2617模型是一个用户,一个凭证,因此用户可能拥有可以授权的第二组凭证的情况可能会被忽略。 它既不暗示也不暗示某种登录页面或其他非RFC2617身份验证协议可能会或可能不会提供帮助 - 这不在RFC2616标准和定义之内。


编辑:RFC2616已过时,请参阅RFC7231和RFC7235。

链接地址: http://www.djcxy.com/p/1963.html

上一篇: 403 Forbidden vs 401 Unauthorized HTTP responses

下一篇: Session Cookies expiration handling in ASP.NET MVC 3 while using WIF and jquery ajax requests