对未经授权的HTTP请求的正确响应是什么?

时间:2009-06-24 11:46:58

标签: asp.net-mvc security http seo

我正在编写Web应用程序我不确定对未经授权的请求的正确响应是什么。对于用户来说,服务器响应302并将其重定向到登录页面时很方便。然而,在内心深处,我觉得401更正确。如果302不能被搜索引擎误解,我也很害怕。

那么您如何回应未经授权的请求?


修改

我正在使用ASP.NET MVC。从理论的角度来看,这并不重要。但是,ASP.NET表单身份验证使用302方法。

我也喜欢在成功登录到他被请求的页面后重定向用户时的行为。我不确定这是否可以通过401方法轻松实现。

6 个答案:

答案 0 :(得分:4)

我认为正确的响应完全取决于请求的上下文。在用于人类(非机器)消费的Web应用程序中,如果用户未经过身份验证,我更愿意重定向到登录,如果用户经过身份验证但未经授权,则更喜欢呈现错误页面。我通常不会返回未经授权的响应,因为它包含的信息太少,无法帮助典型用户使用该应用程序。

对于Web服务,我可能会使用未经授权的响应。由于它通常由另一端的程序使用,因此不需要提供描述性错误消息或重定向。使用该服务的开发人员应该能够识别正确的更改以使其代码正确使用服务 - 假设我已经很好地通过示例记录了接口使用情况。

对于搜索引擎,正确构造的robots.txt文件在将其限制为 public 页面时可能更有用。

答案 1 :(得分:2)

401似乎在语法上是正确的,但是401实际上是一个声明呈现给浏览器以请求凭证 - 浏览器然后期望检查WWW-Authenticate标头以便它可以挑战用户输入正确的细节。

引用规范。

  

请求需要用户   认证。响应必须   包括WWW-Authenticate标头   包含a的字段(第14.47节)   适用于要求的挑战   资源。客户可以重复   请求具有适当的授权   标题字段(第14.8节)。如果   请求已包含授权   凭证,然后401响应   表示已授权   拒绝这些凭据。如果   401响应包含相同的内容   挑战作为先前的反应,和   用户代理已尝试过   认证至少一次,然后   用户应该被呈现给实体   这是在答复中给出的,因为   该实体可能包括相关的   诊断信息。 HTTP访问   身份验证在“HTTP中解释”   身份验证:基本和摘要   访问身份验证“[43]。

如果您执行302,则至少保证将用户定向到他们可以在使用非标准登录时登录的页面。我不太关心搜索引擎等对401的看法。

答案 2 :(得分:1)

我必须同意你的看法,401结果实际上是正确的答案。

这就是为什么没有自定义的401页面设计得很好,并显示未经授权的消息以及登录页面的链接,你可以有15秒的javascript倒计时自动发送到那里。

通过这种方式,您可以向机器人提供正确的401响应,该机器人被告知该页面受到限制,但真实用户在被告知他们正在访问安全资源后会被重定向。

答案 3 :(得分:1)

发送401回复,并在您返回的页面上包含登录表单。 (即,不要只包含登录页面的链接,包括整个表格。)

答案 4 :(得分:1)

如果您的网站主要由人类使用,请不要担心搜索引擎。当用户到达受保护页面时,理想的方法是将它们重定向到登录页面,以便在成功登录后将它们转发到受保护页面。

除非您计划在错误页面中包含登录表单,否则无法通过401错误实现此目的。从可用性的角度来看,第一种情况(302)更合理。

此外,您可以编写代码将人员重定向到您的登录页面,并将搜索引擎重定向到401。

答案 5 :(得分:0)

搜索引擎如何首先将安全页面编入索引?未经授权的用户,例如僵尸程序,不应该首先瞄准恕我直言。